В MongoDB, 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", "hidden" : true } ]
Виждаме, че има три индекса. Третият е скрит. Знаем това, защото има "hidden" : true
.
Този индекс е на weight
поле. Когато изпълняваме заявка през плана на заявката, който отправя заявка за weight
поле, ще видим, че не използва индекса.
Пример:
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
(сканиране на колекция), което означава, че не е използвал индекса.
Показване на индекса
Можем да използваме unhideIndex()
метод за разкриване на индекса. Този метод приема името на индекса или неговия ключов модел като параметър, за да посочи кой индекс да се покаже.
Пример:
db.pets.unhideIndex("idx_weight_-1")
Изход:
{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }
Резултатът от unhideIndex()
method показва старата стойност за hidden
поле (в този случай true
) и новата стойност (в този случай false
).
Ако обаче разкрием вече нескрит индекс (или скрием вече скрит), те не се показват и просто получаваме следното:
{ "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" : "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
, което означава, че е използвал индекса.
Проверете дали индексът е бил разкрит
Можем да използваме 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
.
Но също така не виждаме "hidden" : false
.
Разкриването на индекс просто премахва "hidden" : true
част от резултата от getIndexes()
. hidden
опцията е налична само ако стойността е true
. hidden
опцията е булева стойност, така че можем да заключим, че ако не е "hidden" : true
, тогава е "hidden" : false
.
Не можете да скриете/покажете индекси? Проверете тази настройка.
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
индекс.