Индексирование MongoDB: несколько полей с одним полем или одно составное?

У меня есть коллекция геопространственных и временных данных с несколькими дополнительными свойствами, которые я буду отображать на карте. На данный момент коллекция насчитывает несколько миллионов документов и со временем будет расти.

Каждый документ имеет следующие поля:

  • Местоположение: [объект geojson]
  • Дата: [Объект даты]
  • Уровень масштабирования: [int32]
  • EntryType: [Идентификатор объекта]

Мне нужно иметь возможность быстро запрашивать эту коллекцию по любой комбинации местоположения (обычно это геовнутренний запрос), даты (обычно $gte/$lt), ZoomLevel и EntryType.

Мне интересно: должен ли я сделать составной индекс, содержащий все четыре поля, или один индекс для каждого поля, или какую-то их комбинацию? Я прочитал в документах MongoDB следующее:

Для составного индекса, который включает ключ индекса 2dsphere вместе с ключами других типов, только поле индекса 2dsphere определяет, ссылается ли индекс на документ.

... Звучит так, как будто наличие индекса 2dsphere для местоположения как части составного индекса может быть бессмысленным?

Любая ясность по этому вопросу будет высоко оценена.


person DanM    schedule 20.05.2016    source источник


Ответы (1)


Для вашего варианта использования вам нужно будет использовать несколько индексов.

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

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

РЕДАКТИРОВАТЬ: Что касается вашего вопроса о 2dsphere, имеет смысл сделать их составными.

Это примечание относится к «разреженной» опции. Разреженный индекс ссылается только на документы, которые содержат поля индекса, для 2dspheres единственные документы, которые будут исключены, — это те, которые не содержат массива geojson/point.

person bateloche    schedule 20.05.2016
comment
Ага! Спасибо за указание на бит разреженной опции 2dsphere. Теперь имеет больше смысла. - person DanM; 21.05.2016