sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan hideIndex() virker i MongoDB

MongoDB introducerede db.collection.hideIndex() metode i MongoDB 4.4.

Denne metode skjuler et eksisterende indeks fra forespørgselsplanlæggeren. Dette giver dig mulighed for at evaluere den potentielle effekt af at droppe et indeks uden faktisk at droppe indekset.

Hvis det har en negativ indvirkning at skjule det, kan du bruge db.collection.unhideIndex() for at vise indekset. Dette sparer dig for at skulle droppe indekset og derefter genskabe det.

Eksempel

Antag, at vi har en samling kaldet pets . Lad os returnere de aktuelle indekser på den samling.

db.pets.getIndexes()

Resultat:

[
	{
		"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"
	}
]

Vi kan se, at den har tre indekser. Lad os vælge den tredje kaldet idx_weight_-1 for vores eksempel.

Lad os først se, hvordan forespørgselsplanen ser ud, når vi kører forespørgsler, der bruger det indeks.

db.pets.find( { weight: { $gt: 10 } } ).explain()

Her søger vi efter kæledyr, der er over en vis vægt. Vi bruger explain() metode til at vise forespørgselsplanen i stedet for de faktiske resultater.

Sådan ser forespørgselsplanen ud for denne forespørgsel:

{
	"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
}

Vi kan se, at den bruger IXSCAN hvilket betyder, at den brugte indekset.

Lad os nu skjule indekset.

Skjul indekset

Det er her hideIndex() kommer ind. Vi kan bruge det til at skjule indekset, så det ikke vises på forespørgselsplanen, som det gjorde i det forrige eksempel.

db.pets.hideIndex("idx_weight_-1")

Output:

{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }

Outputtet af hideIndex() metoden viser den gamle værdi for hidden felt (i dette tilfælde false ) og den nye værdi (i dette tilfælde true ).

Men hvis vi skjuler et allerede skjult indeks (eller viser et allerede skjult indeks), vises disse ikke, og vi får bare følgende:

{ "ok" : 1 }

Under alle omstændigheder er indekset nu skjult.

Tjek forespørgselsplanen igen

Lad os køre den forrige forespørgsel igen for at se, hvordan forespørgselsplanen ser ud nu.

db.pets.find( { weight: { $gt: 10 } } ).explain()

Resultat:

{
	"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
}

Denne gang får vi en COLLSCAN , hvilket betyder, at den ikke brugte indekset – den lavede en samlingsscanning.

Tjek, om et indeks er skjult

Du kan bruge getIndexes() metode til at kontrollere, om et indeks er skjult eller ej.

Så vi kan køre den samme forespørgsel, som vi kørte tidligere for at returnere alle indekser:

db.pets.getIndexes()

Resultat:

[
	{
		"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
	}
]

Kan du ikke skjule indekser? Tjek denne indstilling.

mongod featureCompatibilityVersion skal være mindst 4.4 før du kan skjule indekser. Men når et indeks først er skjult, forbliver det skjult selv med featureCompatibilityVersion sat til 4.2 på MongoDB 4.4 binære filer.

Du kan tjekke featureCompatibilityVersion indstilling med følgende kode:

db.adminCommand( 
    { 
        getParameter: 1, 
        featureCompatibilityVersion: 1 
    } 
)

Du kan indstille det ved hjælp af setFeatureCompatibilityVersion kommando:

db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )

setFeatureCompatibilityVersion kommandoen skal køres i admin database.

Bemærk også, at du ikke kan skjule _id indeks.


  1. E11000 duplikatnøglefejlindeks i mongodb mongoose

  2. Grupper og tæl med tilstand

  3. Oprettelse af en redis-lytter - muligt i php?

  4. Hvordan tæller man antallet af nøgler, der matcher et mønster?