MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Funktionsweise von unhideIndex() in MongoDB

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.