Будет ли один глубокий индекс MongoDB поддерживать все запросы до этой глубины? - PullRequest
0 голосов
/ 24 февраля 2020

Запросы для одной из больших таблиц в нашей системе принимают одну из трех форм:

  1. A
  2. A + B + C
  3. A + B + C + D + E

Будет ли один индекс, основанный на индексации A, B, C, D, E вместе (и в том порядке, в котором порядок запросов встроенный) будет достаточным для всех трех запросов, или системе потребуется второй индекс для A и третий для A + B + C.

Если бы я хотел это подтвердить, как бы я это сделал?

1 Ответ

1 голос
/ 24 февраля 2020

Индексы создаются для быстрого доступа к данным, что ускоряет выполнение запросов. Индексы могут быть созданы на одном или нескольких полях; индекс по нескольким полям называется составным индексом .

Документ коллекции имеет поля A, B, C, D, E, X, Y и Z. В этой коллекции несколько запросов, и они используют некоторый поднабор полей в качестве критериев фильтра запроса. Как и в вопросе, запросы находятся в полях:

A
A, B
A, B, C
A, B, C, D

В таких случаях один индекс может быть построен для удовлетворения всех потребностей запросов. Это будет составной индекс со всеми полями: A, B, C и D. Например, создайте индекс:

db.collection.createIndex( { A: 1, B: 1, C: 1, D: 1 } ). Обратите внимание на значение 1, которое указывает индекс как по возрастанию , может быть -1, указывая по убыванию .

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

db.collection.find( { A: "some value" } )
db.collection.find( { A: "some value", B: 24 } )
db.collection.find( { A: "some value", B: 24, C: ISODate("2020-02-24" } )
db.collection.find( { A: "some value", B: 24, C: ISODate("2020-02-24" }, D: "another value" )

Обратите внимание на поля, используемые в запросе, для индекса, который будет использоваться. Запрос только по C или B и D вместе не будет использовать индекс. Поля запросов должны быть подмножеством полей, начинающихся с крайних левых полей (т. Е. A или A+B и т. Д. c.), И они называются Index Префиксы .

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

db.collection.find( { C: ISODate("2020-02-24" }, A: "some value", D: "another value", B: 24 )

Преимущество использования отдельного составного индекса для применения его к нескольким запросам в том, что он уменьшает обслуживание индексов и ресурсы, такие как память и дисковое пространство для индекса. Также обратите внимание, что префиксы индекса могут применяться к операциям сортировки.


План запроса:

Теперь у нас есть теория, что мы можем использовать префиксы индекса Как мы можем убедиться, что это на самом деле работает? Способ состоит в том, чтобы сгенерировать план запросов для запросов, которые используют составной индекс, и проверить использование индекса. План запроса генерируется с помощью метода explain, примененного к коллекции, db.collection.explain () .

Например, db.colection.explain().find( { A: "some value" } ) создает Explain Output , где вы можете увидеть подробную информацию о запросе, использовании индекса и т. Д. c. Вы должны заметить этап, называемый IXSCAN, который указывает на сканирование ключей индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...