Составной индекс, включающий поля фильтра совпадений, необходим для быстрой агрегации. В запросах агрегации наличие стадии $match
на ранней стадии конвейера (предпочтительно первой стадии) использует индексы, если таковые определены в полях фильтра. В размещенном запросе это так, и определение индексов необходимо для быстрого запроса. Но индекс по каким полям?
Индекс будет составной индекс ; т. е. индекс по нескольким полям критериев запроса. Префикс индекса начинается с поля destination
. Остальные поля индекса должны быть определены. Каковы остальные поля?
Большинство этих полей находятся в полях вложенного документа массива prices
- price
, date_from
, date_to
и board_type
. Также есть поле date
из основного документа. Какие из этих полей необходимо использовать в составном индексе?
Определение индексов для элементов массива (или полей поддокументов в массиве) создает множество ключей индекса. Это означает много памяти и для использования индекса памяти (или оперативной памяти). Это важное соображение. Индексы для элементов массива называются индексами с несколькими ключами . Для правильного использования индекса документы коллекции и индекс, используемый запросом (вместе именуемый рабочий набор ), должны помещаться в ОЗУ.
Другим аспектом, который необходимо учитывать, является избирательность запроса . Сколько документов выбирается с использованием фильтра, который использует индексное поле, является фактором. Обязательно, чтобы поле фильтра с должно было выбрать небольшой набор входных документов, чтобы быть эффективными. См. Создание запросов, обеспечивающих селективность .
Трудно определить, какие другие поля необходимо учитывать (обязательно некоторые из полей prices
), основываясь на вышеупомянутых двух факторах. Таким образом, индекс будет примерно таким:
{ destination: 1, fld1: 1, fld2: 1, ... }
fld1
, fld2
, ..., будут полями вложенного документа массива prices
и / или поле date
. Я думаю, что только один набор полей даты может быть использован с индексом. Примером индекса может быть один из них:
{ destination: 1, date: 1, "prices.price": 1, "prices.board_type": 1}
{ destination: 1, "prices.price": 1, "prices.date_from": 1, "prices.date_to": 1, "prices.board_type": 1}
Обратите внимание на ключи индекса order и необходимость из price
, date_from
, date_to
и board_type
определяется на основе двух основных факторов - требования к рабочему набору и избирательности запроса - это важно.
ПРИМЕЧАНИЯ : для небольшого выборочного набора данных с аналогичной структурой показали использование составного индекса с основным полем destination
и двумя полями из prices
(одно с условием равенства и одно с условием диапазона). План запроса с использованием explain
показал IXSCAN (сканирование индекса) в составном индексе, и использование индекса наверняка улучшит производительность запроса.