Выполнение запроса диапазона диапазона с полем даты - PullRequest
0 голосов
/ 08 марта 2020

Я ищу оптимизацию производительности запроса. Моя цель - найти все документы, попадающие в указанный диапазон дат. Коллекция довольно большая, в ней более 6 миллионов документов. Таким образом, запрос выглядит следующим образом:

db.collection.find({
    createdAt: {
        $gte: new Date('2018-06-19'), 
        $lt: new Date('2018-06-22')
    }
})

Он выполняется более 10 минут. Есть ли способ использовать тот факт, что даты отсортированы? Я имею в виду, что документы вставляются во время создания, поэтому каждый документ после последнего документа, попадающего в диапазон, будет вне диапазона, но mon go, вероятно, не знает об этом и ищет те документы, где даты уже находятся вне диапазона ??

Ответы [ 2 ]

0 голосов
/ 09 марта 2020

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

Можно выполнить быстрый запрос диапазона, как описано выше, создав индекс из одного поля в поле даты фильтра запросов поиска. Индексы хранят значение поля ключа индекса и адрес документа в коллекции - это небольшой объем данных. Для типичной коллекции, запроса и индекса данные коллекции и индекс должны быть доступны (или помещаться) в памяти (называемой рабочим набором) для эффективного использования. При выполнении запроса доступ к индексу осуществляется на основе критериев фильтра, а затем соответствующих документов.

Невозможно ускорить выполнение запроса без использования индекса с миллионами документов (обратите внимание, что он может не иметь значения с парой тысяч документов). Это можно продемонстрировать практически в среде dev с набором образцов из пары миллионов документов, индексом в поле фильтра запросов и тестовым прогоном.

Инструмент, который будет использоваться для выполнение этого теста создает план запроса с использованием объяснения . метод объяснения имеет режим «executeStats», который предоставляет такие данные, как используемый индекс (если есть), время выполнения запроса, ключи индекса, к которым обращались, количество возвращенных документов, различные этапы запроса исполнение, et c. Этапы плана покажут, будет ли индекс использоваться запросом. Как правило, запрос, выполняемый с использованием индекса, покажет индексированное сканирование (IXSCAN), а если индекс не используется, это будет сканирование коллекции (COLLSCAN).

Созданный индекс также можно использовать с другими запросами, если применимо, а также сортировки. Кроме того, индекс может быть составным индексом (с использованием нескольких полей) и может использоваться с другими запросами.

Также см. FAQ: Indexes для получения дополнительной информации. Поскольку у вас уже есть большая коллекция, см. Построения индексов для заполненных коллекций для ознакомления с указаниями.

Команда db.collection.stats () полезна для определения размера коллекции и индекса.

В дополнение к индексации, проекция только обязательных полей также может повлиять на производительность вашего запроса.

0 голосов
/ 08 марта 2020

MongoDB не может использовать «факт», потому что он не знает, какие двоичные документы хранятся.

При поиске по неиндексированному полю Mongodb выполняет COLLSCAN (объяснено здесь )

Индексирование:

Начиная с версии 4.2 MongoDB использует оптимизированный процесс сборки, который удерживает монопольную блокировку только в начале и в конце процесса сборки.

До версии 4.2 вам необходимо указать background option

db.collection.createIndex({createdAt:1}, {background:true})

https://docs.mongodb.com/manual/reference/method/db.collection.createIndex/#options для всех типов индекса

...