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

3 maneiras de ocultar um índice do plano de consulta no MongoDB


A partir do MongoDB 4.4, agora podemos ocultar índices do plano de consulta. Isso nos permite avaliar o impacto potencial de descartar um índice sem realmente descartar o índice.

Se ocultá-lo tiver um impacto negativo, podemos reexibir o índice. Isso evita que tenhamos que descartar o índice e recriá-lo novamente.

Abaixo estão 3 maneiras de ocultar um índice no MongoDB.

O hideIndex() Método


O db.collection.hideIndex() O método faz exatamente o que promete – oculta o índice (do planejador de consultas).

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

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

Isso oculta um índice chamado idx_weight_-1 nos pets coleção. Alternativamente, poderíamos fornecer o padrão de chave para o índice em vez do nome.

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.

O hideIndex() é na verdade um wrapper para o collMod comando de administração (abaixo).

O collMod Comando


O collMod O comando de administração nos permite adicionar opções a uma coleção ou modificar as definições de visualização.

Podemos usá-lo para ocultar um índice passando hidden: true .

Exemplo:
db.runCommand( {
   collMod: "pets",
   index: {
      name: "idx_weight_-1",
      hidden: true
   }
} )

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

Isso retorna o mesmo documento que hideIndex() retorna.

Semelhante a hideIndex() , você tem a opção de especificar o nome do índice ou seu padrão de chave.

Aqui está um exemplo de uso do padrão de chave:
db.runCommand( {
   collMod: "pets",
   index: {
      keyPattern: { weight : -1 },
      hidden: true
   }
} )

Nesse caso, o índice foi definido usando { weight : -1 } , e, portanto, essa definição pode ser usada em vez do nome do índice.

Para verificar isso, podemos usar getIndexes() para ver a definição do índice:
db.pets.getIndexes()

Resultado:
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"weight" : -1
		},
		"name" : "idx_weight_-1",
		"hidden" : true
	}
]

Também podemos reexibir o índice passando hidden: false .

Criar um índice oculto


A terceira maneira de ocultar um índice é criá-lo como um índice oculto.

Para fazer isso, use hidden: true como uma das opções ao criar o índice.

Exemplo:
db.pets.createIndex( 
    { type: 1 },
    { hidden: true }
)

Saída:
{
	"createdCollectionAutomatically" : false,
	"numIndexesBefore" : 2,
	"numIndexesAfter" : 3,
	"ok" : 1
}

Agora vamos chamar getIndexes() novamente para verificar nosso índice oculto recém-criado:
db.pets.getIndexes()

Resultado:
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"weight" : -1
		},
		"name" : "idx_weight_-1",
		"hidden" : true
	},
	{
		"v" : 2,
		"hidden" : true,
		"key" : {
			"type" : 1
		},
		"name" : "type_1"
	}
]

Podemos ver que ele foi criado com "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.