Разреженный индекс не улучшает сортировку в MongoDB? - PullRequest
0 голосов
/ 17 января 2019

У меня есть коллекция с> 100 КБ документов. Пример документа будет выглядеть как

{ 
    "created_at" : 1545039649, 
    "priority" : 3, 
    "id" : 68, 
    "name" : "document68"
}


db.mycol.find().sort({created_at:1})

и

db.mycol.find().sort({priority:1})

приводит к ошибке.

Error: error: {
    "ok" : 0,
    "errmsg" : "Executor error during find command: OperationFailed: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.",
    "code" : 96,
    "codeName" : "OperationFailed"
}

Затем я проиндексировал эти поля.

db.mycol.createIndex({'priority':1})
db.mycol.createIndex({'created_at':1}, {sparse:true})

Добавлен разреженный индекс в create_at , так как это обязательное поле.

Сейчас

db.mycol.find().sort({priority:1})

дает результат. Но

db.mycol.find().sort({created_at:1})

по-прежнему приводит к той же ошибке.

1 Ответ

0 голосов
/ 17 января 2019

Разреженный индекс можно использовать только при фильтрации по created_at: {$exists: true}.

Причина в том, что все остальные записи не являются частью индекса (но они все еще должны появляться в результате - возможно, в конце).

Может быть, вам не нужно делать индекс разреженным (что имеет смысл только тогда, когда в большинстве записей нет поля - в противном случае вы все равно не сэкономите много места в хранилище индекса)? created_at звучит так, как если бы большинство записей имело это.

Добавлен редкий индекс в созданный_каталог, так как это обязательное поле.

На самом деле, все наоборот: редкий индекс требуется только в том случае, если поле является необязательным (и довольно редким).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...