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 МБ.
- Как бы вы смоделировали эту связь с базой данных?
- Удаление частичных данных в mongoDB
- Как создать веб-страницу для поиска в базе данных mongoDB?
- MongoDB: Почему update () возвращает значение null даже в случае успеха?
- Как сделать больше или меньше, чем использовать MongoDB?
Существует способ принудительного использования определенного индекса при выполнении запроса, называемый hint
.
Просто назовите его курсором:
cursor = collection.find({query-doc}).hint({index-fields})
Система индексирования Mongodb основана на экспериментах. В основном оптимизатор запросов будет запускать ваши запросы, используя все возможные индексы и сравнить время для каждого. Он научится использовать лучший индекс для заданного типа запроса. Из документов по оптимизатору запросов :
при тестировании новых планов MongoDB параллельно выполняет несколько планов запросов. Как только один заканчивается, он прекращает другие казни, и система узнала, какой план хорош
Если ваша коллекция довольно мала, возможно, что индекс, выбранный оптимизатором запросов, не тот, который вы считаете лучшим. Однако это быстрее для этого запроса и этой коллекции. Когда ваша коллекция вырастет, возможно, другой индекс будет лучше соответствовать.
В вашем случае, я думаю, что mongo легче сканировать все документы, а затем сортировать их с индексом на d, потому что у вас очень мало документов.
Попробуйте выполнить один и тот же запрос (несколько раз, чтобы повысить эффективность обучения) против коллекции с большим количеством документов (скажем, 1 миллион), вы, вероятно, увидите, что он будет использовать полный индекс.
Таким образом, использовать подсказку не нужно (это не повредит, хотя). Мой совет: пусть оптимизатор запросов mongo выполняет свою работу 🙂
- Это занимает много времени … как ускорить этот словарь? (Python)
- Список пользователей для определенной базы данных с помощью PyMongo
- Есть ли ограничение на количество таблиц, которые может иметь база данных PostgreSQL?
- SqlAlchemy IntegrityError
- Отношение «один ко многим» SQLAlchemy, которые зависят друг от друга
- Вставка MongoDB повышает повторяемость ключа
- Обновление Pymongo: возможно ли вставить поле с '$ currentDate' только один раз?
- Могу ли я использовать ту же базу данных MongoDB из Python и NodeJS
- Монго связи / ссылки: наиболее эффективный способ? Примеры?