MongoDB hat den db.collection.hideIndex()
eingeführt -Methode in MongoDB 4.4.
Diese Methode verbirgt einen vorhandenen Index vor dem Abfrageplaner. Auf diese Weise können Sie die potenziellen Auswirkungen des Löschens eines Index bewerten, ohne den Index tatsächlich zu löschen.
Wenn das Ausblenden negative Auswirkungen hat, können Sie db.collection.unhideIndex()
verwenden um den Index einzublenden. Dadurch müssen Sie den Index nicht löschen und dann neu erstellen.
Beispiel
Angenommen, wir haben eine Sammlung namens pets
. Lassen Sie uns die aktuellen Indizes für diese Sammlung zurückgeben.
db.pets.getIndexes()
Ergebnis:
[ { "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" } ]
Wir können sehen, dass es drei Indizes hat. Wählen wir den dritten namens idx_weight_-1
für unser Beispiel.
Sehen wir uns zunächst an, wie der Abfrageplan aussieht, wenn wir Abfragen ausführen, die diesen Index verwenden.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Hier suchen wir nach Haustieren, die ein bestimmtes Gewicht überschreiten. Wir verwenden explain()
Methode, um den Abfrageplan anstelle der tatsächlichen Ergebnisse anzuzeigen.
So sieht der Abfrageplan für diese Abfrage aus:
{ "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 }
Wir können sehen, dass es IXSCAN
verwendet was bedeutet, dass es den Index verwendet hat.
Lassen Sie uns nun den Index ausblenden.
Index ausblenden
Hier ist hideIndex()
kommt. Wir können es verwenden, um den Index zu verstecken, sodass er nicht wie im vorherigen Beispiel im Abfrageplan angezeigt wird.
db.pets.hideIndex("idx_weight_-1")
Ausgabe:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
Die Ausgabe von hideIndex()
Methode zeigt den alten Wert für hidden
an Feld (in diesem Fall false
) und den neuen Wert (in diesem Fall true
).
Wenn wir jedoch einen bereits ausgeblendeten Index ausblenden (oder einen bereits eingeblendeten einblenden), werden diese nicht angezeigt, und wir erhalten nur Folgendes:
{ "ok" : 1 }
In jedem Fall ist der Index jetzt ausgeblendet.
Überprüfen Sie den Abfrageplan erneut
Lassen Sie uns die vorherige Abfrage erneut ausführen, um zu sehen, wie der Abfrageplan jetzt aussieht.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Ergebnis:
{ "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 }
Dieses Mal erhalten wir einen COLLSCAN
, was bedeutet, dass es den Index nicht verwendet hat – es hat einen Sammlungsscan durchgeführt.
Überprüfen Sie, ob ein Index ausgeblendet ist
Sie können getIndexes()
verwenden Methode, um zu prüfen, ob ein Index versteckt ist oder nicht.
Wir können also dieselbe Abfrage ausführen, die wir zuvor ausgeführt haben, um alle Indizes zurückzugeben:
db.pets.getIndexes()
Ergebnis:
[ { "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 } ]
Können Indizes nicht ausgeblendet werden? Überprüfen Sie diese Einstellung.
Der mongod
featureCompatibilityVersion
muss mindestens 4.4
sein bevor Sie Indizes ausblenden können. Ein einmal ausgeblendeter Index bleibt jedoch auch mit featureCompatibilityVersion
ausgeblendet auf MongoDB 4.4-Binärdateien auf 4.2 gesetzt.
Sie können die featureCompatibilityVersion
überprüfen Einstellung mit folgendem Code:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
Sie können es mit setFeatureCompatibilityVersion
festlegen Befehl:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
Die setFeatureCompatibilityVersion
Der Befehl muss im admin
ausgeführt werden Datenbank.
Beachten Sie auch, dass Sie die _id
nicht ausblenden können index.