In MongoDB der db.collection.unhideIndex()
Methode blendet einen versteckten Index ein.
Ein versteckter Index ist ein Index, der vor dem Abfrageplaner verborgen ist. Wenn Sie einen Index einblenden, ist er nicht mehr im Abfrageplaner verborgen und steht sofort zur Verwendung zur Verfügung.
Beispiel
Angenommen, wir haben eine Sammlung namens pets
, und wir wollen es auf versteckte Indizes überprüfen. Wir könnten die folgende Abfrage ausführen, um alle Indizes für die Sammlung 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 } ]
Wir können sehen, dass es drei Indizes gibt. Der dritte ist versteckt. Wir wissen das, weil es "hidden" : true
hat .
Dieser Index befindet sich auf dem weight
Feld. Wenn wir eine Abfrage über den Abfrageplan ausführen, der das weight
abfragt Feld, werden wir sehen, dass es den Index nicht verwendet.
Beispiel:
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 }
Wir können sehen, dass es einen COLLSCAN
durchgeführt hat (ein Sammlungsscan), was bedeutet, dass der Index nicht verwendet wurde.
Den Index einblenden
Wir können den unhideIndex()
verwenden Methode zum Einblenden des Indexes. Diese Methode akzeptiert den Namen des Index oder sein Schlüsselmuster als Parameter, um anzugeben, welcher Index eingeblendet werden soll.
Beispiel:
db.pets.unhideIndex("idx_weight_-1")
Ausgabe:
{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }
Die Ausgabe von unhideIndex()
Methode zeigt den alten Wert für hidden
an Feld (in diesem Fall true
) und den neuen Wert (in diesem Fall false
).
Wenn wir jedoch einen bereits eingeblendeten Index einblenden (oder einen bereits ausgeblendeten ausblenden), werden diese nicht angezeigt, und wir erhalten nur Folgendes:
{ "ok" : 1 }
Unabhängig davon ist der Index jetzt eingeblendet.
Ü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" : "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 hat , was bedeutet, dass der Index verwendet wurde.
Überprüfen Sie, ob der Index eingeblendet wurde
Wir können getIndexes()
verwenden Methode erneut, um zu überprüfen, ob der Index eingeblendet wurde oder nicht.
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 sehen dieselben drei Indizes wie im vorherigen Beispiel, aber dieses Mal sehen wir nicht "hidden" : true
.
Aber wir sehen auch nicht "hidden" : false
.
Das Einblenden eines Indexes entfernt einfach den "hidden" : true
Teil aus dem Ergebnis von getIndexes()
. Der hidden
Option ist nur verfügbar, wenn der Wert true
ist . Der hidden
option ist ein boolescher Wert, daher können wir daraus schließen, dass wenn es nicht "hidden" : true
ist , dann ist es "hidden" : false
.
Können Indizes nicht ein-/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.