sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur hideIndex() fungerar i MongoDB

MongoDB introducerade db.collection.hideIndex() metod i MongoDB 4.4.

Den här metoden döljer ett befintligt index från frågeplaneraren. Detta låter dig utvärdera den potentiella effekten av att ta bort ett index utan att faktiskt ta bort indexet.

Om att dölja det har en negativ inverkan kan du använda db.collection.unhideIndex() för att visa indexet. Detta gör att du slipper släppa indexet och sedan återskapa det.

Exempel

Anta att vi har en samling som heter pets . Låt oss returnera de aktuella indexen för den samlingen.

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 att den har tre index. Låt oss välja den tredje som heter idx_weight_-1 för vårt exempel.

Låt oss först se hur frågeplanen ser ut när vi kör frågor som använder det indexet.

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

Här letar vi efter husdjur som väger över en viss vikt. Vi använder explain() metod för att visa frågeplanen istället för de faktiska resultaten.

Så här ser frågeplanen ut för den här frågan:

{
	"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 att den använder IXSCAN vilket betyder att den använde indexet.

Låt oss nu dölja indexet.

Dölj indexet

Det är här hideIndex() kommer in. Vi kan använda det för att dölja indexet så att det inte visas i frågeplanen som det gjorde i föregående exempel.

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

Utdata:

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

Utdata från hideIndex() metoden visar det gamla värdet för hidden fältet (i det här fallet false ) och det nya värdet (i detta fall true ).

Men om vi döljer ett redan dolt index (eller visar ett redan dolt) visas dessa inte, och vi får bara följande:

{ "ok" : 1 }

I alla fall är indexet nu dolt.

Kontrollera frågeplanen igen

Låt oss köra om den tidigare frågan för att se hur frågeplanen ser ut 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
}

Den här gången får vi en COLLSCAN , vilket betyder att den inte använde indexet – den gjorde en samlingsskanning.

Kontrollera om ett index är dolt

Du kan använda getIndexes() metod för att kontrollera om ett index är dolt eller inte.

Så vi kan köra samma fråga som vi körde tidigare för att returnera alla index:

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 inte dölja index? Kontrollera den här inställningen.

mongod featureCompatibilityVersion måste vara minst 4.4 innan du kan dölja index. Men när det väl är dolt kommer ett index att förbli dolt även med featureCompatibilityVersion inställd på 4.2 på MongoDB 4.4 binärer.

Du kan kontrollera featureCompatibilityVersion inställning med följande kod:

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

Du kan ställa in den med setFeatureCompatibilityVersion kommando:

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

setFeatureCompatibilityVersion kommandot måste köras i admin databas.

Observera också att du inte kan dölja _id index.


  1. Redis Sentinels med TLS

  2. Få en distinkt aggregering av ett matrisfält över index

  3. Meteor och DBRefs

  4. hur hanterar man session expire baserat på redis?