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

Come funziona hideIndex() in MongoDB

MongoDB ha introdotto il db.collection.hideIndex() metodo in MongoDB 4.4.

Questo metodo nasconde un indice esistente dal pianificatore di query. Ciò ti consente di valutare il potenziale impatto dell'eliminazione di un indice senza effettivamente eliminare l'indice.

Se nasconderlo ha un impatto negativo, puoi utilizzare db.collection.unhideIndex() per mostrare l'indice. Ciò ti evita di dover eliminare l'indice, quindi ricrearlo.

Esempio

Supponiamo di avere una collezione chiamata pets . Restituiamo gli indici correnti su quella raccolta.

db.pets.getIndexes()

Risultato:

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

Possiamo vedere che ha tre indici. Scegliamo il terzo chiamato idx_weight_-1 per il nostro esempio.

Per prima cosa, vediamo come appare il piano di query quando eseguiamo query che utilizzano quell'indice.

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

Qui, stiamo cercando animali domestici che superano un certo peso. Stiamo usando explain() metodo per visualizzare il piano della query invece dei risultati effettivi.

Ecco come appare il piano di query per questa query:

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

Possiamo vedere che utilizza IXSCAN il che significa che ha utilizzato l'indice.

Ora nascondiamo l'indice.

Nascondi l'indice

Qui è dove hideIndex() entra. Possiamo usarlo per nascondere l'indice in modo che non venga visualizzato nel piano di query come nell'esempio precedente.

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

Uscita:

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

L'output di hideIndex() il metodo mostra il vecchio valore per hidden campo (in questo caso false ) e il nuovo valore (in questo caso true ).

Tuttavia, se nascondiamo un indice già nascosto (o mostriamo uno già non nascosto), questi non vengono visualizzati e otteniamo solo quanto segue:

{ "ok" : 1 }

In ogni caso, l'indice è ora nascosto.

Ricontrolla il piano delle query

Eseguiamo nuovamente la query precedente per vedere come appare ora il piano di query.

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

Risultato:

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

Questa volta otteniamo un COLLSCAN , il che significa che non ha utilizzato l'indice, ma ha eseguito una scansione della raccolta.

Verifica se un indice è nascosto

Puoi usare getIndexes() metodo per verificare se un indice è nascosto o meno.

Quindi, possiamo eseguire la stessa query eseguita in precedenza per restituire tutti gli indici:

db.pets.getIndexes()

Risultato:

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

Non riesci a nascondere gli indici? Controlla questa impostazione.

Il mongod featureCompatibilityVersion deve essere almeno 4.4 prima di poter nascondere gli indici. Tuttavia, una volta nascosto, un indice rimarrà nascosto anche con featureCompatibilityVersion impostato su 4.2 sui binari MongoDB 4.4.

Puoi controllare la featureCompatibilityVersion impostazione con il seguente codice:

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

Puoi impostarlo utilizzando setFeatureCompatibilityVersion comando:

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

Il setFeatureCompatibilityVersion il comando deve essere eseguito in admin banca dati.

Nota inoltre che non puoi nascondere il _id indice.