Составной индекс mongodb и пересечение индекса

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

Имеет ли смысл иметь следующие индексы (соответствующие запросам):

{"sid":1, "cid":1, "mid":1}
{"cid":1, "hid":1, "mid":1}
{"mid":1, "hid":1, "sid":1}
{"hid":1, "sid":1, "cid":1, "mid":1}
{"mid":1, "cid":1}
{"mid":1, "sid":1}

Or:

{sid:1}
{cid:1}
{hid:1}
{mid:1} 

person MikeJavadi    schedule 05.05.2015    source источник


Ответы (1)


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

Я бы сказал: лучше иметь составные индексы.

Несмотря на то, что нужно поддерживать больше индексов, это дает прямые ответы на ваши запросы без проблемных вычислений, необходимых для пересечения. Я имею в виду, что вы делаете это с более чем 3,5 миллиардами записей, это плохо кончится.

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

Кажется, что пересечение MongoDB стало более продвинутым:

Как правило, каждое пересечение индексов включает два индекса; однако MongoDB может использовать множественные/вложенные пересечения индексов для разрешения запроса.

http://docs.mongodb.org/manual/core/index-intersection/

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

Я ответил на аналогичный вопрос некоторое время назад, когда 10gen сказал, что пересечение секций - это, по сути, последнее средство, а не то, что желательно.

person Sammaye    schedule 05.05.2015
comment
Спасибо за ваш ответ. Я не знаю, как будет работать пересечение, поскольку (по крайней мере, я предполагаю), что 3 индекса все равно будут загружены в память. Так что теоретически единственное, что я бы сохранил, это какой-то диск. Я имею дело с некоторыми осколками, которые все еще нуждаются в балансировке, и я полагал, что индексы еще больше замедлят балансировщик (когда я перезапущу его). (у меня не было хороших сведений о распределении данных ключа сегмента, чтобы я мог лучше предварительно разделить фрагменты. Когда вы услышали это от 10-го поколения? v2.4 или v2.6? - person MikeJavadi; 06.05.2015
comment
Пересечения @MikeJavadi намного тяжелее, чем просто наличие индекса в памяти. Я имею в виду, что для пересечения вам нужно выполнить пересечение массива для каждого из индексов, медленно сводя их к ответу. - person Sammaye; 06.05.2015
comment
@MikeJavadi, как это услышать: jira.mongodb.org/browse/SERVER-3071 это в комментариях - person Sammaye; 06.05.2015