Нужны ли составные индексы, если каждый атрибут индексируется в коллекции mongodb?

Предположим, у меня есть коллекция в базе данных монго со следующими документами

{
    "name" : "abc",
    "email": "[email protected]",
    "phone" : "+91 1234567890"
}

В коллекции много объектов (миллион или около того), и мое приложение, помимо регулярного добавления объектов в эту коллекцию, выполняет несколько различных типов поиска этих данных.

Один метод выполняет поиск со всеми тремя атрибутами (имя, адрес электронной почты и телефон), поэтому я могу создать составной индекс для этих трех полей, чтобы убедиться, что этот поиск работает эффективно.

db.mycollection.ensureIndex({name:1,email:1,phone:1})

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

db.mycollection.ensureIndex({name:1})

Постепенно мое приложение разрастается до такой степени, что мне приходится индексировать другие поля.

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

Очевидно, это плохой пример... Если бы я создавал коллекцию для хранения нескольких контактных данных человека, я бы использовал массивы. Но этот вопрос касается исключительно индексов.


person Munim    schedule 26.06.2013    source источник
comment
На самом деле все зависит от характера ваших запросов ... слишком много индексов плохо влияет на производительность (если много вставок). Например, с составным индексом вы не можете выполнять поиск только по phone. Обязательно прочтите этот раздел: docs.mongodb.org/manual/core/ индексы/#составные-индексы   -  person WiredPrairie    schedule 27.06.2013


Ответы (2)


Это зависит от ваших запросов.

Если вы делаете запрос, например:

db.mycollection.find({"name": "abc", email: "[email protected]", phone: "+91 1234567890"});

тогда составной индекс был бы наиболее эффективным.

person Alex    schedule 26.06.2013
comment
Да, я делаю этот запрос. Это очевидно. Мой вопрос: если я также выполняю запрос, в котором я ищу по 2 атрибутам или только по одному атрибуту, мне также нужно добавить индексы для этих находок. Так мне все еще нужно поддерживать составные индексы? Или мне даже нужны отдельные индексы? - person Munim; 26.06.2013

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

person Munim    schedule 03.07.2013