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

Funktionsweise von hideIndex() in MongoDB

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.