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

Come funziona unhideIndex() in MongoDB

In MongoDB, il db.collection.unhideIndex() il metodo mostra un indice nascosto.

Un indice nascosto è nascosto dal pianificatore di query. Quando mostri un indice, questo non è più nascosto dal pianificatore di query ed è immediatamente disponibile per l'uso.

Esempio

Supponiamo di avere una collezione chiamata pets e vogliamo controllarlo per gli indici nascosti. Potremmo eseguire la seguente query per restituire tutti gli indici sulla 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",
		"hidden" : true
	}
]

Possiamo vedere che ci sono tre indici. Il terzo è nascosto. Lo sappiamo, perché ha "hidden" : true .

Quell'indice è sul weight campo. Quando eseguiamo una query tramite il piano di query che interroga il weight campo, vedremo che non utilizza l'indice.

Esempio:

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
}

Possiamo vedere che ha eseguito un COLLSCAN (una scansione della raccolta), il che significa che non ha utilizzato l'indice.

Scopri l'indice

Possiamo usare unhideIndex() metodo per mostrare l'indice. Questo metodo accetta il nome dell'indice o il relativo modello di chiave come parametro per specificare quale indice visualizzare.

Esempio:

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

Uscita:

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

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

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

{ "ok" : 1 }

Indipendentemente da ciò, l'indice ora non è 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" : "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 utilizzava IXSCAN , il che significa che ha utilizzato l'indice.

Verifica se l'indice è stato svelato

Possiamo usare getIndexes() metodo di nuovo per verificare se l'indice è stato scoperto o meno.

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

Vediamo gli stessi tre indici che abbiamo visto nell'esempio precedente, ma questa volta non vediamo "hidden" : true .

Ma non vediamo nemmeno "hidden" : false .

La visualizzazione di un indice rimuove semplicemente il "hidden" : true parte dal risultato di getIndexes() . Il hidden l'opzione è disponibile solo se il valore è true . Il hidden opzione è un valore booleano, quindi possiamo dedurre che se non è "hidden" : true , quindi è "hidden" : false .

Non riesci a nascondere/mostrare 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.