如何提高mongoDb查询性能?

时间:2019-02-22 10:13:07

标签: node.js mongodb mongoose mongodb-query database-performance

我有一个名为die的收藏集。 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

但是使用CodesSchema.index({configId: 1, 'permissions.all': 1, 'permissions.users': 1}); 选项运行查询会返回:

.explain('executionStats')

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

1 个答案:

答案 0 :(得分:1)

索引本身是正确的。

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

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

“说明”部分-您应选中winningPlan

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

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

使用索引时,它将更改为

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