MongoDB ha introdotto il db.collection.hideIndex()
metodo in MongoDB 4.4.
Questo metodo nasconde un indice esistente dal pianificatore di query. Ciò ti consente di valutare il potenziale impatto dell'eliminazione di un indice senza effettivamente eliminare l'indice.
Se nasconderlo ha un impatto negativo, puoi utilizzare db.collection.unhideIndex()
per mostrare l'indice. Ciò ti evita di dover eliminare l'indice, quindi ricrearlo.
Esempio
Supponiamo di avere una collezione chiamata pets
. Restituiamo gli indici correnti su quella raccolta.
db.pets.getIndexes()
Risultato:
[ { "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" } ]
Possiamo vedere che ha tre indici. Scegliamo il terzo chiamato idx_weight_-1
per il nostro esempio.
Per prima cosa, vediamo come appare il piano di query quando eseguiamo query che utilizzano quell'indice.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Qui, stiamo cercando animali domestici che superano un certo peso. Stiamo usando explain()
metodo per visualizzare il piano della query invece dei risultati effettivi.
Ecco come appare il piano di query per questa query:
{ "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 }
Possiamo vedere che utilizza IXSCAN
il che significa che ha utilizzato l'indice.
Ora nascondiamo l'indice.
Nascondi l'indice
Qui è dove hideIndex()
entra. Possiamo usarlo per nascondere l'indice in modo che non venga visualizzato nel piano di query come nell'esempio precedente.
db.pets.hideIndex("idx_weight_-1")
Uscita:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
L'output di hideIndex()
il metodo mostra il vecchio valore per hidden
campo (in questo caso false
) e il nuovo valore (in questo caso true
).
Tuttavia, se nascondiamo un indice già nascosto (o mostriamo uno già non nascosto), questi non vengono visualizzati e otteniamo solo quanto segue:
{ "ok" : 1 }
In ogni caso, l'indice è ora nascosto.
Ricontrolla il piano delle query
Eseguiamo nuovamente la query precedente per vedere come appare ora il piano di query.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Risultato:
{ "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 }
Questa volta otteniamo un COLLSCAN
, il che significa che non ha utilizzato l'indice, ma ha eseguito una scansione della raccolta.
Verifica se un indice è nascosto
Puoi usare getIndexes()
metodo per verificare se un indice è nascosto o meno.
Quindi, possiamo eseguire la stessa query eseguita in precedenza per restituire tutti gli indici:
db.pets.getIndexes()
Risultato:
[ { "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 } ]
Non riesci a nascondere gli indici? Controlla questa impostazione.
Il mongod
featureCompatibilityVersion
deve essere almeno 4.4
prima di poter nascondere gli indici. Tuttavia, una volta nascosto, un indice rimarrà nascosto anche con featureCompatibilityVersion
impostato su 4.2 sui binari MongoDB 4.4.
Puoi controllare la featureCompatibilityVersion
impostazione con il seguente codice:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
Puoi impostarlo utilizzando setFeatureCompatibilityVersion
comando:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
Il setFeatureCompatibilityVersion
il comando deve essere eseguito in admin
banca dati.
Nota inoltre che non puoi nascondere il _id
indice.