Вопрос по sorting, mongodb, performance – Почему направление индекса имеет значение в MongoDB?

100

Процитироватьдокументы:

When creating an index, the number associated with a key specifies the direction of the index, so it should always be 1 (ascending) or -1 (descending). Direction doesn't matter for single key indexes or for random access retrieval but is important if you are doing sorts or range queries on compound indexes.

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

Ваш Ответ

3   ответа
9

Why indexes

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

  1. While an index is better than no index, the correct index is much better than either.
  2. MongoDB will only use one index per query, making compound indexes with proper field ordering what you probably want to use.

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

How Indexes

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

Why Sorting

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

How Sorting

Вы можете указать сортировку для всех ключей индекса или подмножества; однако ключи сортировки должны быть перечислены в том же порядке, в котором они указаны в индексе. Например, шаблон ключа индекса {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 }
{ 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 }
Error: User Rate Limit Exceeded{ a: 1, b: 1, c: 1 }Error: User Rate Limit Exceeded{ a: 1}Error: User Rate Limit Exceeded{ a: 1, b: 1}Error: User Rate Limit Exceeded{ a: 1, b: 1, c: 1 }Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
93

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

When finding single items - Порядок узлов в дереве не имеет значения.

If you are returning a range of nodes - Элементы, расположенные близко друг к другу, будут располагаться на одной ветви дерева. Чем ближе узлы находятся в диапазоне, тем быстрее они могут быть найдены.

With a single field index  - Заказ не имеет значения. Если они расположены близко друг к другу в порядке возрастания, они также будут близко друг к другу в порядке убывания.

When you have a compound key - Порядок начинает иметь значение.

Например, если ключ 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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded johndodo
Error: User Rate Limit Exceeded1, 3, 2, 6, 5, 4, 7? johndodo
Error: User Rate Limit ExceededMySQL indexesError: User Rate Limit Exceeded johndodo
42

simple answer что вы ищете, это то, что направлениеonly matters when you are sorting on two or more fields.

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

Индекс{a : 1, b : 1} будетslower than индекс{a : 1, b : -1}

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededentireError: User Rate Limit ExceededaError: User Rate Limit ExceededbError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded{a: -1, b: -1}Error: User Rate Limit Exceeded{a: -1, b: -1}Error: User Rate Limit Exceeded{a: 1, b: 1}Error: User Rate Limit Exceeded

Похожие вопросы