Почему направление индекса имеет значение в MongoDB?

Чтобы процитировать docs:

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

Однако я не вижу причин, по которым направление индекса должно иметь значение на составных индексах. Может ли кто-нибудь дать дополнительное объяснение (или пример)?

Ответ 1

MongoDB каким-то образом конкатенирует составной ключ и использует его как ключ в BTree.

При поиске отдельных элементов - порядок узлов в дереве не имеет значения.

Если вы возвращаете диапазон узлов - Элементы, расположенные рядом друг с другом, будут иметь те же ветки дерева. Чем ближе узлы находятся в диапазоне, тем быстрее они могут быть восстановлены.

С одним индексом поля - порядок не будет иметь значения. Если они близки друг к другу в порядке возрастания, они также будут близки друг к другу в порядке убывания.

Если у вас сложный ключ - порядок начинает действовать.

Например, если ключ A по возрастанию B возрастает, индекс может выглядеть примерно так:

Row   A B
1     1 1
2     2 6
3     2 7 
4     3 4
5     3 5
6     3 6
7     5 1

Запрос для восходящего B по возрастанию должен будет перескочить вокруг индекса, чтобы вернуть строки и будет медленнее. Например, он вернет строку 1, 3, 2, 6, 5, 4, 7

Запрос диапазона в том же порядке, в котором индекс будет просто последовательно возвращать строки в правильном порядке.

Поиск записи в BTree требует времени O (Log (n)). Поиск диапазона записей по порядку - это только OLog (n) + k, где k - количество возвращаемых записей.

Если записи не соответствуют порядку, стоимость может быть такой же высокой, как OLog (n) * k

Ответ 2

простой ответ, который вы ищете, - это то, что направление имеет значение только при сортировке по двум полям.

Если вы сортируете по {a : 1, b : -1}:

Индекс {a : 1, b : 1} будет медленнее, чем индекс {a : 1, b : -1}

Ответ 3

Почему индексы

Поймите два ключевых момента.

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

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

Как индексы

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

Почему сортировка

Ваши запросы могут потребоваться Сортировка. Но сортировка может быть дорогостоящей операцией, поэтому важно обрабатывать поля, которые вы сортируете, точно так же, как поле, которое вы запрашиваете. Таким образом, это будет быстрее, если у него есть индекс. Однако есть одно важное отличие: поле, которое вы сортируете, должно быть последним полем вашего индекса. Единственным исключением из этого правила является то, что поле также является частью вашего запроса, тогда обязательное правило не применяется.

Порядок сортировки

Вы можете указать сортировку по всем клавишам индекса или подмножества; однако ключи сортировки должны быть указаны в том же порядке, что и в индексе. Например, шаблон ключевого индекса {a: 1, b: 1} может поддерживать сортировку на {a: 1, b: 1}, но не на {b: 1, a: 1}.

Сортировка должна указывать то же направление сортировки (то есть восходящее/нисходящее) для всех его ключей в качестве шаблона ключа индекса или указывать направление обратной сортировки для всех его ключей в качестве шаблона индекса. Например, шаблон ключа индекса {a: 1, b: 1} может поддерживать сортировку по {a: 1, b: 1} и {a: -1, b: -1}, но не на {a: -1, b: 1}.

Предположим, что есть эти индексы:

{ a: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }

Example                                                    Index Used
db.data.find().sort( { a: 1 } )                            { a: 1 }
db.data.find().sort( { a: -1 } )                           { a: 1 }
db.data.find().sort( { a: 1, b: 1 } )                      { a: 1, b: 1 }
db.data.find().sort( { a: -1, b: -1 } )                    { a: 1, b: 1 }
db.data.find().sort( { a: 1, b: 1, c: 1 } )                { a: 1, b: 1, c: 1 }
db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } )   { a: 1, b: 1 }