Индексы создаются для быстрого доступа к данным, что ускоряет выполнение запросов. Индексы могут быть созданы на одном или нескольких полях; индекс по нескольким полям называется составным индексом .
Документ коллекции имеет поля 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, который указывает на сканирование ключей индекса.