MongoDB въведе db.collection.hideIndex()
метод в MongoDB 4.4.
Този метод скрива съществуващ индекс от планирането на заявки. Това ви позволява да оцените потенциалното въздействие от отпадането на индекс, без действително да отпадате индекса.
Ако скриването му има отрицателно въздействие, можете да използвате db.collection.unhideIndex()
за да разкриете индекса. Това ви спестява необходимостта да пускате индекса, след което да го създавате отново.
Пример
Да предположим, че имаме колекция, наречена pets
. Нека върнем текущите индекси на тази колекция.
db.pets.getIndexes()
Резултат:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "name" : 1, "type" : -1 }, "name" : "idx_name_1_type_-1" }, { "v" : 2, "key" : { "weight" : -1 }, "name" : "idx_weight_-1" } ]
Виждаме, че има три индекса. Нека изберем третия, наречен idx_weight_-1
за нашия пример.
Първо, нека видим как изглежда планът на заявката, когато изпълняваме заявки, които използват този индекс.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Тук търсим домашни любимци, които са над определено тегло. Използваме explain()
метод за показване на плана на заявката вместо действителните резултати.
Ето как изглежда планът на заявката за тази заявка:
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "PetHouse.pets", "indexFilterSet" : false, "parsedQuery" : { "weight" : { "$gt" : 10 } }, "queryHash" : "CEB852E7", "planCacheKey" : "851FBDB5", "winningPlan" : { "stage" : "FETCH", "inputStage" : { "stage" : "IXSCAN", "keyPattern" : { "weight" : -1 }, "indexName" : "idx_weight_-1", "isMultiKey" : false, "multiKeyPaths" : { "weight" : [ ] }, "isUnique" : false, "isSparse" : false, "isPartial" : false, "indexVersion" : 2, "direction" : "forward", "indexBounds" : { "weight" : [ "[inf.0, 10.0)" ] } } }, "rejectedPlans" : [ ] }, "ok" : 1 }
Можем да видим, че използва IXSCAN
което означава, че е използвал индекса.
Сега нека скрием индекса.
Скриване на индекса
Това е мястото, където hideIndex()
Можем да го използваме, за да скрием индекса, така че да не се показва в плана на заявката, както беше в предишния пример.
db.pets.hideIndex("idx_weight_-1")
Изход:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
Резултатът от hideIndex()
method показва старата стойност за hidden
поле (в този случай false
) и новата стойност (в този случай true
).
Въпреки това, ако скрием вече скрит индекс (или покажем вече нескрит), те не се показват и просто получаваме следното:
{ "ok" : 1 }
Във всеки случай индексът вече е скрит.
Проверете отново плана на заявката
Нека стартираме отново предишната заявка, за да видим как изглежда планът на заявката сега.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Резултат:
{ "queryPlanner" : { "plannerVersion" : 1, "namespace" : "PetHouse.pets", "indexFilterSet" : false, "parsedQuery" : { "weight" : { "$gt" : 10 } }, "queryHash" : "CEB852E7", "planCacheKey" : "851FBDB5", "winningPlan" : { "stage" : "COLLSCAN", "filter" : { "weight" : { "$gt" : 10 } }, "direction" : "forward" }, "rejectedPlans" : [ ] }, "ok" : 1 }
Този път получаваме COLLSCAN
, което означава, че не е използвал индекса, а е извършил сканиране на колекция.
Проверете дали даден индекс е скрит
Можете да използвате getIndexes()
метод за проверка дали даден индекс е скрит или не.
Така че можем да изпълним същата заявка, която изпълнихме по-рано, за да върнем всички индекси:
db.pets.getIndexes()
Резултат:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "name" : 1, "type" : -1 }, "name" : "idx_name_1_type_-1" }, { "v" : 2, "key" : { "weight" : -1 }, "name" : "idx_weight_-1", "hidden" : true } ]
Не можете да скриете индекси? Проверете тази настройка.
mongod
featureCompatibilityVersion
трябва да е най-малко 4.4
преди да можете да скриете индекси. Въпреки това, след като бъде скрит, индексът ще остане скрит дори с featureCompatibilityVersion
зададен на 4.2 на MongoDB 4.4 двоични файлове.
Можете да проверите featureCompatibilityVersion
настройка със следния код:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
Можете да го настроите с помощта на setFeatureCompatibilityVersion
команда:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
setFeatureCompatibilityVersion
командата трябва да се изпълни в admin
база данни.
Също така имайте предвид, че не можете да скриете _id
индекс.