MongoDB — составные индексы

Опубликовано: 5 Октября, 2022

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

Как создать составной индекс?

В MongoDB мы можем создать составной индекс, используя метод createIndex().

Синтаксис:

db.collection.createIndex({<field1>: <type1>, <field2>: <type2>, …})

Здесь <type> представляет значение поля в спецификации индекса, описывает тип индекса для этого поля. Например, значение 1 для индексации в порядке возрастания или значение -1 для индексации в порядке убывания.

Например:

{"id":"1", "product":"chips", "manufacturer":"lays", "price":20} 
{"id":"2", "product":"pringles", "manufacturer":"Kellogg"s", "price":99}
{"id":"3", "product":"Doritos", "manufacturer":"lays", "price":10}
{"id":"4", "product":"cheetos", "manufacturer":"lays", "price":473}
{"id":"5", "product":"coldrink", "manufacturer":"mountain-dew", "price":20}

В приведенных выше четырех документах мы можем индексировать их как по имени поля, так и по возрасту в любом порядке. Предположим, мы создаем составной индекс с помощью db.collection.createIndex(manufacturer:1, price:-1), тогда индекс будет выглядеть примерно так

Как показано на картинке, сначала Kellogs, Lays и Mountain-Dew сортируются по алфавиту, а затем внутри них сортируются цены. Здесь индексация будет производиться сначала в порядке возрастания имени производителя, а затем в порядке убывания цены. Таким образом, мы можем эффективно выполнять такие запросы, как db.collection.find().sort(manufacturer:1, price: -1), так как мы создали для этого индекс.

Примеры -

В следующих примерах мы работаем с:

Database: GeeksforGeeks

Collection: products

Documents: Six documents that contain the details of the employees in the form of field-value pairs.

Составление составного индекса по производству и цене:

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

db.products.createIndex({manufacturer:1, price:-1})

Создание составного индекса по продукту, производителю и цене:

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

db.products.createIndex({product:1,manufacturer:1,price:1}) 

Сортировка с использованием составных индексов

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

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

Например, предположим, что мы создаем составной индекс с помощью

db.data.createIndex({a:1, b: -1, c:1})

Затем у нас есть следующие префиксы, по которым используется наш созданный индекс для сортировки —

{a:1}
{a:1,b:-1}
{a:1,b-1,c:1}
Пример

префикс

db.data.find().sort({a: 1})

{а: 1}

db.data.find().sort({a: -1})

{а: 1}

db.data.find().sort({a: 1, b: -1})

{а: 1, б: -1}

db.data.find().sort({a: -1, b: 1})

{а: 1, б: -1}

db.data.find().sort({a: 1, b: -1, c: 1})

{а: 1, б: -1, в: 1}

Таким образом, для всех примеров в приведенной выше таблице MongoDB будет использовать созданный нами индекс, но не для db.data.find().sort({a: -1, b: -1}) или db.data.find().sort ({a: 1, b: 1}), так как они не соответствуют ни одному префиксу для этих двух, MongoDB должен выполнять сортировку с блокировкой.

Мы также можем использовать для сортировки без префикса, например {b: -1, c: 1}, но для этого мы должны установить равенство для предыдущего ключа префикса. Например,

db.data.find({a: 6}).sort({b: -1, c: 1})

Здесь мы поставили условие равенства на ключ 'a', и теперь он будет использовать префикс {a: 1, b: -1, c: 1}

Пример:

db.products.find().sort({manufacturer:1,price:-1}) 

В приведенном выше примере, поскольку наш шаблон ключа сортировки имеет изготовление: 1, цена: -1, который аналогичен второму ключу индекса изготовления_1_цена_-1, поэтому этот индекс будет использоваться для получения результата вместо повторной сортировки.