MongoDB
Индексы
Поиск…
Синтаксис
db.collection.createIndex({ <string field> : <1|-1 order> [, <string field> : <1|-1 order>] });
замечания
Влияние производительности : обратите внимание, что индексы улучшают производительность чтения, но могут иметь плохое влияние на производительность записи, так как вставка документа требует обновления всех индексов.
Одно поле
db.people.createIndex({name: 1})
Это создает восходящий единый индекс поля на имя поля.
В этом типе индексов порядок сортировки не имеет значения, поскольку монго может пересекать индекс в обоих направлениях.
Соединение
db.people.createIndex({name: 1, age: -1})
Это создает индекс для нескольких полей, в этом случае в полях name
и age
. Он будет возрастать по name
и спускается по age
.
В этом типе индекса порядок сортировки имеет значение, поскольку он будет определять, поддерживает ли индекс операцию сортировки или нет. Обратная сортировка поддерживается на любом префиксе составного индекса, если сортировка находится в обратном направлении сортировки для всех ключей в сортировке. В противном случае сортировка для составных индексов должна соответствовать порядку индекса.
Правило поля также важно, в этом случае индекс будет сортироваться сначала по name
и в пределах каждого значения имени, отсортированного по значениям поля age
. Это позволяет использовать индекс по запросам в поле name
, или по name
и age
, но не по age
.
удалять
Чтобы удалить индекс, вы можете использовать имя индекса
db.people.dropIndex("nameIndex")
Или документ спецификации индекса
db.people.dropIndex({name: 1})
Список
db.people.getIndexes()
Это вернет массив документов, каждый из которых описывает индекс в коллекции людей
Основы создания индекса
См. Сбор данных ниже.
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
getIndexes()
будут отображать все индексы, доступные для коллекции.
db.transactions.getIndexes();
Посмотрим на результат вышеприведенного утверждения.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
}
]
Уже существует один индекс для сбора транзакций. Это связано с тем, что MongoDB создает уникальный индекс в поле _id
во время создания коллекции. Индекс _id
позволяет клиентам вставлять два документа с тем же значением для поля _id
. Вы не можете отбросить этот индекс в поле _id
.
Теперь добавим индекс для поля cr_dr;
db.transactions.createIndex({ cr_dr : 1 });
Результат выполнения индекса выглядит следующим образом.
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
СозданныйCollectionAutomatically указывает, была ли операция создана коллекция. Если коллекция не существует, MongoDB создает коллекцию как часть операции индексирования.
Пусть запустите db.transactions.getIndexes();
снова.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
}
]
Теперь вы видите, что сбор транзакций имеет два индекса. По умолчанию _id
index и cr_dr_1
которые мы создали. Имя присваивается MongoDB. Вы можете указать свое имя, как показано ниже.
db.transactions.createIndex({ cr_dr : -1 },{name : "index on cr_dr desc"})
Теперь db.transactions.getIndexes();
даст вам три показателя.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : -1
},
"name" : "index on cr_dr desc",
"ns" : "documentation_db.transactions"
}
]
При создании индекса { cr_dr : -1 }
1 индекс будет в порядке ascending
и -1 для descending
порядка.
Хэшированные индексы
Индексы могут быть определены также как хэшированные . Это более эффективно для запросов равенства , но неэффективно для запросов диапазона ; однако вы можете определить как хэшированные, так и восходящие / нисходящие индексы в одном поле.
> db.transactions.createIndex({ cr_dr : "hashed" });
> db.transactions.getIndexes(
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : "hashed"
},
"name" : "cr_dr_hashed",
"ns" : "documentation_db.transactions"
}
]
Удаление / удаление индекса
Если имя индекса известно,
db.collection.dropIndex('name_of_index');
Если имя индекса неизвестно,
db.collection.dropIndex( { 'name_of_field' : -1 } );
Получить индексы коллекции
db.collection.getIndexes();
Выход
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : -1
},
"name" : "index on cr_dr desc",
"ns" : "documentation_db.transactions"
}
]
Уникальный указатель
db.collection.createIndex( { "user_id": 1 }, { unique: true } )
применять уникальность по определенному индексу (как единому, так и сложному). Построение индекса не удастся, если коллекция уже содержит повторяющиеся значения; индексирование не удастся также с несколькими записями, пропускающими поле (поскольку все они будут проиндексированы со значением null
), если не sparse: true
.
Редкие индексы и частичные индексы
Редкие индексы:
Они могут быть особенно полезны для полей, которые являются необязательными, но которые также должны быть уникальными.
{ "_id" : "[email protected]", "nickname" : "Johnnie" }
{ "_id" : "[email protected]" }
{ "_id" : "[email protected]", "nickname" : "Jules"}
{ "_id" : "[email protected]" }
Поскольку в двух записях не указано «ник», а индексирование будет обрабатывать неопределенные поля как null, создание индекса завершится неудачно, если два документа имеют «null», поэтому:
db.scores.createIndex( { nickname: 1 } , { unique: true, sparse: true } )
позволит вам по-прежнему иметь нулевые псевдонимы.
Разреженные индексы более компактны, поскольку они пропускают / игнорируют документы, которые не указывают это поле. Поэтому, если у вас есть коллекция, в которой указано это поле не более 10% документов, вы можете создавать гораздо меньшие индексы - лучше использовать ограниченную память, если вы хотите делать такие запросы, как:
db.scores.find({'nickname': 'Johnnie'})
Частичные индексы:
Частичные индексы представляют собой надмножество функциональности, предлагаемой разреженными индексами, и должны быть предпочтительнее более разреженных индексов. ( Новое в версии 3.2 )
Частичные индексы определяют записи индекса на основе указанного фильтра.
db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
Если rating
больше 5, тогда будет индексироваться cuisine
. Да, мы можем указать свойство, которое будет индексироваться на основе значения других свойств.
Разница между разреженными и частичными индексами:
Редкие индексы выбирают документы для индексации исключительно на основе существования индексированного поля или для составных индексов, наличия индексированных полей.
Частичные индексы определяют записи индекса на основе указанного фильтра. Фильтр может включать в себя поля, отличные от клавиш индекса, и может указывать условия, отличные от проверки наличия.
Тем не менее, частичный индекс может реализовать то же поведение, что и разреженный индекс
Например:
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
Примечание: Параметр partialFilterExpression и разреженный параметр не могут быть указаны одновременно.