繁体   English   中英

如何提高mongoDb查询性能?

[英]How to improve mongoDb query performance?

我有一个名为Codes的集合。 这是定义Schema方式:

import mongoose from 'mongoose'
import autoIncrement from 'mongoose-auto-increment';

const Schema = mongoose.Schema;
const CodesSchema = mongoose.Schema(
  {
    configId: { type: Number },
    campaignId: { type: Number },
    permissions: {
      all: { type: Boolean, default: false },
      users: { type: [Number], default: [] }
    }
)

autoIncrement.initialize(mongoose.connection);
CodesSchema.plugin(autoIncrement.plugin, { model: 'Codes', field: 'campaignId' });
export default mongoose.model('Codes', CodesSchema)

有一个查询看起来像这样:

const query = {
  $and:[
    {$or: [
      {'permissions.all': true},
      {'permissions.users': 12}
    ]},
    {configId: 3}
  ]
};

Codes.find(query, (err, res) => {
  // do something with the result
})

这可以正常工作,但是如果数据库中有大量文档,则此查询确实很慢。

我有什么办法可以改善此特定查询的性能? 我认为createIndex会有所帮助,但由于存在$and$or条件,因此不确定是否可以应用。

UPDATE

我以这种方式添加了索引:

CodesSchema.index({configId: 1, 'permissions.all': 1, 'permissions.users': 1});

但是使用.explain('executionStats')选项运行查询会返回:

{
    "executionSuccess" : true,
    "nReturned" : 6,
    "executionTimeMillis" : 0,
    "totalKeysExamined" : 10,
    "totalDocsExamined" : 10,
}

这似乎不对,因为检查的文档数大于返回的文档数。

索引本身是正确的。

它必须是CodesSchema.index ,而不是Code.index

确保调用Code.syncIndexes来更新索引dbside。

“解释”部分-您应检查winningPlan

如果查询未使用任何索引,则应类似于

    "winningPlan" : {
        "stage" : "COLLSCAN",
        "filter" : {

使用索引时,它变为

    "winningPlan" : {
        "stage" : "FETCH",
        "inputStage" : {
            "stage" : "OR",
            "inputStages" : [ 
                {
                    "stage" : "IXSCAN",
                    "keyPattern" : {

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM