MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como hideIndex() funciona no MongoDB


O MongoDB introduziu o db.collection.hideIndex() método no MongoDB 4.4.

Esse método oculta um índice existente do planejador de consulta. Isso permite que você avalie o impacto potencial de descartar um índice sem realmente descartar o índice.

Se ocultá-lo tiver um impacto negativo, você pode usar db.collection.unhideIndex() para exibir o índice. Isso evita que você tenha que descartar o índice e recriá-lo.

Exemplo


Suponha que tenhamos uma coleção chamada pets . Vamos retornar os índices atuais nessa coleção.
db.pets.getIndexes()

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

Podemos ver que ele tem três índices. Vamos escolher o terceiro chamado idx_weight_-1 para o nosso exemplo.

Primeiro, vamos ver como é o plano de consulta quando executamos consultas que usam esse índice.
db.pets.find( { weight: { $gt: 10 } } ).explain()

Aqui, estamos procurando por animais de estimação que estão acima de um certo peso. Estamos usando o explain() método para exibir o plano de consulta em vez dos resultados reais.

Veja como é o plano de consulta para esta consulta:
{
	"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
}

Podemos ver que ele usa IXSCAN o que significa que ele usou o índice.

Agora vamos ocultar o index.

Ocultar o índice


É aqui que hideIndex() Podemos usá-lo para ocultar o índice para que ele não apareça no plano de consulta como no exemplo anterior.
db.pets.hideIndex("idx_weight_-1")

Saída:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }

A saída do hideIndex() método exibe o valor antigo para o hidden campo (neste caso false ) e o novo valor (neste caso true ).

No entanto, se ocultarmos um índice já oculto (ou exibir um já não oculto), eles não serão exibidos e obteremos apenas o seguinte:
{ "ok" : 1 }

De qualquer forma, o índice agora está oculto.

Verifique novamente o plano de consulta


Vamos executar novamente a consulta anterior para ver como está o plano de consulta agora.
db.pets.find( { weight: { $gt: 10 } } ).explain()

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

Desta vez temos um COLLSCAN , o que significa que ele não usou o índice – ele fez uma varredura de coleção.

Verificar se um índice está oculto


Você pode usar o getIndexes() método para verificar se um índice está ou não oculto.

Assim, podemos executar a mesma consulta que executamos anteriormente para retornar todos os índices:
db.pets.getIndexes()

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

Não é possível ocultar índices? Verifique esta configuração.


O mongod featureCompatibilityVersion deve ser pelo menos 4.4 antes que você possa ocultar índices. No entanto, uma vez oculto, um índice permanecerá oculto mesmo com featureCompatibilityVersion definido como 4.2 nos binários do MongoDB 4.4.

Você pode verificar a featureCompatibilityVersion configuração com o seguinte código:
db.adminCommand( 
    { 
        getParameter: 1, 
        featureCompatibilityVersion: 1 
    } 
)

Você pode configurá-lo usando o setFeatureCompatibilityVersion comando:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )

A setFeatureCompatibilityVersion comando precisa ser executado no admin base de dados.

Observe também que você não pode ocultar o _id índice.