Как улучшить производительность запросов mongoDb? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть коллекция с именем 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') возвращает:

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

Что не кажется правильным, поскольку числоПроверенных документов больше, чем количество возвращенных документов.

1 Ответ

0 голосов
/ 22 февраля 2019

Сам индекс правильный.

Это должно быть CodesSchema.index, а не Code.index.

Убедитесь, что вы вызываете Code.syncIndexes для обновления индексов на стороне.

Часть объяснения - вам нужно проверить winningPlan.

Если в запросе не используются индексы, это должно быть что-то вроде

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

КогдаИндекс используется, он меняется на

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