V MongoDB, db.collection.unhideIndex()
metoda odkryje skrytý index.
Skrytý index je index, který je skrytý před plánovačem dotazů. Když index odkryjete, nebude již skrytý před plánovačem dotazů a je okamžitě k dispozici k použití.
Příklad
Předpokládejme, že máme sbírku nazvanou pets
a chceme v něm zkontrolovat skryté indexy. Mohli bychom spustit následující dotaz, abychom vrátili všechny indexy v kolekci:
db.pets.getIndexes()
Výsledek:
[ { "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 } ]
Vidíme, že existují tři indexy. Třetí je skrytý. Víme to, protože má "hidden" : true
.
Tento index má weight
pole. Když spustíme dotaz přes plán dotazů, který se dotazuje na weight
pole, uvidíme, že nepoužívá index.
Příklad:
db.pets.find( { weight: { $gt: 10 } } ).explain()
Výsledek:
{ "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 }
Vidíme, že to provedlo COLLSCAN
(skenování kolekce), což znamená, že nepoužil index.
Zobrazení rejstříku
Můžeme použít unhideIndex()
metoda k odkrytí indexu. Tato metoda přijímá název indexu nebo jeho klíčový vzor jako parametr pro určení, který index se má odkrýt.
Příklad:
db.pets.unhideIndex("idx_weight_-1")
Výstup:
{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }
Výstup unhideIndex()
metoda zobrazí starou hodnotu pro hidden
pole (v tomto případě true
) a novou hodnotu (v tomto případě false
).
Pokud však odkryjeme již neskrytý index (nebo skryjeme již skrytý), tyto se nezobrazí a dostaneme pouze následující:
{ "ok" : 1 }
Bez ohledu na to je index nyní nekrytý.
Znovu zkontrolujte plán dotazů
Spusťte znovu předchozí dotaz, abyste viděli, jak nyní vypadá plán dotazů.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Výsledek:
{ "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 }
Vidíme, že používá IXSCAN
, což znamená, že použil index.
Zkontrolujte, zda byl index odkryt
Můžeme použít getIndexes()
znovu zkontrolovat, zda byl index odkryt.
db.pets.getIndexes()
Výsledek:
[ { "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" } ]
Vidíme stejné tři indexy, které jsme viděli v předchozím příkladu, ale tentokrát nevidíme "hidden" : true
.
Ale také nevidíme "hidden" : false
.
Odkrytí indexu jednoduše odstraní "hidden" : true
část z výsledku getIndexes()
. hidden
možnost je dostupná pouze v případě, že je hodnota true
. hidden
option je booleovská hodnota, takže můžeme odvodit, že pokud to není "hidden" : true
, pak je "hidden" : false
.
Nelze skrýt/odkrýt indexy? Zkontrolujte toto nastavení.
mongod
featureCompatibilityVersion
musí být alespoň 4.4
než budete moci skrýt indexy. Jakmile je však index skrytý, zůstane skrytý i s featureCompatibilityVersion
nastaveno na 4.2 na binárních souborech MongoDB 4.4.
Můžete zkontrolovat featureCompatibilityVersion
nastavení pomocí následujícího kódu:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
Můžete jej nastavit pomocí setFeatureCompatibilityVersion
příkaz:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
setFeatureCompatibilityVersion
příkaz je třeba spustit v admin
databáze.
Pamatujte také, že nemůžete skrýt _id
index.