MongoDB Оптимизация FindAndModify или Найти + Сортировать

Запуск MongoDB, я пытаюсь поставить очередь поиска по трем столбцам (a, b, c) с рангом приоритета (d). У меня есть запрос типа (синтаксис pymongo):

collection.find({'a':'foo','b':'bar','c':'baz'}, sort = [('d', -1)] ) 

С составным индексом (a + 1, b + 1, c + 1, d-1), выполняющим объяснение, отображается полное сканирование таблицы и BasicCursor.

С одним индексом на d объясняется, что используется только один индекс d.

Для большой таблицы я действительно хочу использовать составной индекс. Как я могу сделать эту работу?

INDEX_INFORMATION: {u ' id ': {u'key ': [(u'_id', 1)], u'v ': 1}, u'color_1_level_1_in_progress_1_Ranking_-1': {u'key ': [(u' color ', 1), (u'level', 1), (u'in_progress ', 1), (u'Ranking', -1)], u'v ': 1}}

 EXPLAIN ON A FIND+SORT QUERY db.coll.find({'level' : {'$in' : [0,1,2]}, 'in_progress' : 0, 'color' : {'$in' : ['Red', 'Blue', 'Green]} }, sort = [('Ranking', -1)] ).explain() OUTPUT ON EXPLAIN OperationFailure: database error: too much data for sort() with no index. add an index or specify a smaller limit THE QUEUEING QUERY I CARE ABOUT OPTIMIZING coll.find_and_modify( query = {'level' : {'$in' : [0,1,2]}, 'in_progress' : 0, 'color' : {'$in' : ['Red', 'Blue', 'Green']} }, sort = {'Ranking' : -1}, update = {'$set': {'in_progress': 1}} ) 

Обратите внимание, что когда я добавляю индекс в поле сортировки «Ранжирование», объяснение возвращает, что используется индекс ранжирования. Но составной индекс никогда не используется, а производительность очень медленная на корпусе для проверки документов размером 1,5 МБ.

Существует способ принудительного использования определенного индекса при выполнении запроса, называемый hint .

Просто назовите его курсором:

 cursor = collection.find({query-doc}).hint({index-fields}) 

Система индексирования Mongodb основана на экспериментах. В основном оптимизатор запросов будет запускать ваши запросы, используя все возможные индексы и сравнить время для каждого. Он научится использовать лучший индекс для заданного типа запроса. Из документов по оптимизатору запросов :

при тестировании новых планов MongoDB параллельно выполняет несколько планов запросов. Как только один заканчивается, он прекращает другие казни, и система узнала, какой план хорош

Если ваша коллекция довольно мала, возможно, что индекс, выбранный оптимизатором запросов, не тот, который вы считаете лучшим. Однако это быстрее для этого запроса и этой коллекции. Когда ваша коллекция вырастет, возможно, другой индекс будет лучше соответствовать.

В вашем случае, я думаю, что mongo легче сканировать все документы, а затем сортировать их с индексом на d, потому что у вас очень мало документов.

Попробуйте выполнить один и тот же запрос (несколько раз, чтобы повысить эффективность обучения) против коллекции с большим количеством документов (скажем, 1 миллион), вы, вероятно, увидите, что он будет использовать полный индекс.

Таким образом, использовать подсказку не нужно (это не повредит, хотя). Мой совет: пусть оптимизатор запросов mongo выполняет свою работу 🙂