MongoDB představil db.collection.hideIndex()
metoda v MongoDB 4.4.
Tato metoda skryje existující index z plánovače dotazů. To vám umožní vyhodnotit potenciální dopad vypuštění indexu, aniž byste index skutečně vypustili.
Pokud má skrytí negativní dopad, můžete použít db.collection.unhideIndex()
pro odkrytí indexu. To vám ušetří nutnost rušit index a poté jej znovu vytvářet.
Příklad
Předpokládejme, že máme sbírku nazvanou pets
. Vraťme aktuální indexy této kolekce.
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, že má tři indexy. Vyberme třetí s názvem idx_weight_-1
pro náš příklad.
Nejprve se podívejme, jak vypadá plán dotazů, když spouštíme dotazy, které používají tento index.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Zde hledáme mazlíčky, které překračují určitou váhu. Používáme explain()
metoda k zobrazení plánu dotazů namísto skutečných výsledků.
Takto vypadá plán dotazů pro tento dotaz:
{ "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.
Nyní skryjme index.
Skrýt rejstřík
Zde je hideIndex()
Můžeme jej použít ke skrytí indexu, aby se nezobrazoval v plánu dotazů jako v předchozím příkladu.
db.pets.hideIndex("idx_weight_-1")
Výstup:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
Výstup hideIndex()
metoda zobrazí starou hodnotu pro hidden
pole (v tomto případě false
) a novou hodnotu (v tomto případě true
).
Pokud však skryjeme již skrytý index (nebo odkryjeme již skrytý index), tyto se nezobrazí a dostaneme pouze následující:
{ "ok" : 1 }
V každém případě je index nyní skrytý.
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" : "COLLSCAN", "filter" : { "weight" : { "$gt" : 10 } }, "direction" : "forward" }, "rejectedPlans" : [ ] }, "ok" : 1 }
Tentokrát dostaneme COLLSCAN
, což znamená, že nepoužil index – provedl skenování kolekce.
Zkontrolujte, zda je index skrytý
Můžete použít getIndexes()
metoda pro kontrolu, zda je index skrytý.
Můžeme tedy spustit stejný dotaz, který jsme spustili dříve, abychom vrátili všechny indexy:
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 } ]
Nelze skrý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.