MongoDB каким-то образом объединяет составной ключ и использует его как ключ в BTree.
При нахождении отдельных элементов - порядок узлов в дереве не имеет значения.
Если вы возвращаете диапазон узлов - элементы, близкие друг к другу, будут находиться в тех же ветвях дерева. Чем ближе узлы находятся в диапазоне, тем быстрее их можно извлечь.
С одним индексом поля - порядок не имеет значения. Если они расположены близко друг к другу в порядке возрастания, они также будут находиться рядом в порядке убывания.
Когда у вас есть составной ключ - порядок начинает иметь значение.
Например, если ключ - A по возрастанию B по возрастанию, индекс может выглядеть примерно так:
Ряд AB
1 1 1
2 2 6
3 2 7
4 3 4
5 3 5
6 3 6
7 5 1
Запрос для A по возрастанию B по убыванию должен будет перемещаться по индексу не по порядку, чтобы вернуть строки, и будет медленнее. Например, он вернет Row1, 3, 2, 6, 5, 4, 7
Ранжированный запрос в том же порядке, что и индекс, просто вернет строки последовательно в правильном порядке.
Поиск записи в BTree занимает время O (Log (n)). Поиск диапазона записей по порядку - это только OLog (n) + k, где k - количество возвращаемых записей.
Если записи не в порядке, стоимость может достигать OLog (n) * k
1, 3, 2, 6, 5, 4, 7
?Простой ответ , который вы ищете, что направление имеет значение только тогда , когда разбирают на двух или более полей .
Если вы сортируете по
{a : 1, b : -1}
:Индекс
{a : 1, b : 1}
будет медленнее индекса{a : 1, b : -1}
источник
{a: -1, b: -1}
, будет ли у меня{a: -1, b: -1}
индекс или будет{a: 1, b: 1}
достаточно.{a: 1, b: 1}
индекса должно быть достаточно, так как полностью инвертировать индекс можно. например, Индекс{a: 1}
можно использовать для сортировки по{a: -1}
Почему индексы
Поймите два ключевых момента.
Индексы не бесплатны. Они забирают память и снижают производительность при вставке, обновлении и удалении. Обычно снижение производительности незначительно (особенно по сравнению с увеличением производительности чтения), но это не означает, что мы не можем грамотно создавать индексы.
Как индексы
Определение того, какую группу полей следует проиндексировать вместе, связано с пониманием выполняемых вами запросов. Порядок полей, используемых для создания индекса, имеет решающее значение. Хорошая новость заключается в том, что, если вы сделаете неправильный порядок, индекс вообще не будет использоваться, поэтому его будет легко обнаружить с помощью объяснения.
Почему Сортировка
Вашим запросам может потребоваться сортировка. Но сортировка может быть дорогостоящей операцией, поэтому важно относиться к полям, по которым вы сортируете, как к полю, к которому вы запрашиваете. Так будет быстрее, если у него будет index. Однако есть одно важное отличие: поле, которое вы сортируете, должно быть последним полем в вашем индексе. Единственным исключением из этого правила является то, что если поле также является частью вашего запроса, то правило must-be-last не применяется.
Как Сортировка
Вы можете указать сортировку по всем ключам индекса или по подмножеству; однако ключи сортировки должны быть перечислены в том же порядке, в каком они появляются в указателе. Например, шаблон ключа индекса {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 , б: 1}.
Допустим, есть такие индексы:
источник
{ a: 1, b: 1, c: 1 }
, действительно ли вам нужны индексы{ a: 1}
и /{ a: 1, b: 1}
или индекс{ a: 1, b: 1, c: 1 }
охватывает все случаи? Если запросы всегда используют одну и ту же сортировку: 1 без сортировки в запросе с -1