sql >> Database >  >> NoSQL >> MongoDB

Hoe hideIndex() werkt in MongoDB

MongoDB introduceerde de db.collection.hideIndex() methode in MongoDB 4.4.

Deze methode verbergt een bestaande index voor de queryplanner. Dit stelt u in staat om de potentiële impact van het laten vallen van een index te evalueren zonder de index daadwerkelijk te laten vallen.

Als het verbergen ervan een negatief effect heeft, kunt u db.collection.unhideIndex() gebruiken om de index zichtbaar te maken. Hierdoor hoeft u de index niet te verwijderen en vervolgens opnieuw aan te maken.

Voorbeeld

Stel dat we een verzameling hebben met de naam pets . Laten we de huidige indexen van die verzameling teruggeven.

db.pets.getIndexes()

Resultaat:

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

We kunnen zien dat het drie indexen heeft. Laten we de derde kiezen genaamd idx_weight_-1 voor ons voorbeeld.

Laten we eerst eens kijken hoe het queryplan eruitziet als we query's uitvoeren die die index gebruiken.

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

Hier zoeken we naar huisdieren die een bepaald gewicht hebben. We gebruiken de explain() methode om het zoekplan weer te geven in plaats van de werkelijke resultaten.

Zo ziet het zoekplan eruit voor deze zoekvraag:

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

We kunnen zien dat het IXSCAN . gebruikt wat betekent dat het de index heeft gebruikt.

Laten we nu de index verbergen.

Verberg de index

Dit is waar hideIndex() komt binnen. We kunnen het gebruiken om de index te verbergen, zodat deze niet wordt weergegeven in het queryplan zoals in het vorige voorbeeld.

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

Uitgang:

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

De uitvoer van de hideIndex() methode geeft de oude waarde weer voor de hidden veld (in dit geval false ) en de nieuwe waarde (in dit geval true ).

Als we echter een reeds verborgen index verbergen (of een reeds verborgen index zichtbaar maken), worden deze niet weergegeven en krijgen we alleen het volgende:

{ "ok" : 1 }

In ieder geval is de index nu verborgen.

Controleer het queryplan opnieuw

Laten we de vorige query opnieuw uitvoeren om te zien hoe het queryplan er nu uitziet.

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

Resultaat:

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

Deze keer krijgen we een COLLSCAN , wat betekent dat het de index niet heeft gebruikt - het heeft een collectiescan uitgevoerd.

Controleer of een index verborgen is

U kunt de getIndexes() . gebruiken methode om te controleren of een index al dan niet verborgen is.

We kunnen dus dezelfde query uitvoeren die we eerder hebben uitgevoerd om alle indexen te retourneren:

db.pets.getIndexes()

Resultaat:

[
	{
		"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 indexen niet verbergen? Vink deze instelling aan.

De mongod featureCompatibilityVersion moet minimaal 4.4 . zijn voordat u indexen kunt verbergen. Eenmaal verborgen, blijft een index echter verborgen, zelfs met featureCompatibilityVersion ingesteld op 4.2 op MongoDB 4.4 binaire bestanden.

U kunt de featureCompatibilityVersion . controleren instelling met de volgende code:

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

U kunt het instellen met behulp van de setFeatureCompatibilityVersion commando:

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

De setFeatureCompatibilityVersion commando moet worden uitgevoerd in de admin database.

Merk ook op dat u de _id . niet kunt verbergen index.


  1. Hoe gebruik je redis PUBLISH/SUBSCRIBE met nodejs om klanten op de hoogte te stellen wanneer gegevenswaarden veranderen?

  2. Hoe een verbinding met Redis Sentinel tot stand te brengen met behulp van de Jedis-bibliotheek?

  3. Couchbase-benchmark onthult zeer trage INSERT's en GET's (met behulp van KeyValue-bewerkingen); langzamer dan aanhoudende MySQL-gegevens

  4. Regio's in Azure-cache/DataCache-stijl in Redis