MongoDB — составные индексы
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, поэтому этот индекс будет использоваться для получения результата вместо повторной сортировки.