sql >> Databáze >  >> NoSQL >> MongoDB

Jak funguje unhideIndex() v MongoDB

V MongoDB, db.collection.unhideIndex() metoda odkryje skrytý index.

Skrytý index je index, který je skrytý před plánovačem dotazů. Když index odkryjete, nebude již skrytý před plánovačem dotazů a je okamžitě k dispozici k použití.

Příklad

Předpokládejme, že máme sbírku nazvanou pets a chceme v něm zkontrolovat skryté indexy. Mohli bychom spustit následující dotaz, abychom vrátili všechny indexy v kolekci:

db.pets.getIndexes()

Výsledek:

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

Vidíme, že existují tři indexy. Třetí je skrytý. Víme to, protože má "hidden" : true .

Tento index má weight pole. Když spustíme dotaz přes plán dotazů, který se dotazuje na weight pole, uvidíme, že nepoužívá index.

Příklad:

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

Výsledek:

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

Vidíme, že to provedlo COLLSCAN (skenování kolekce), což znamená, že nepoužil index.

Zobrazení rejstříku

Můžeme použít unhideIndex() metoda k odkrytí indexu. Tato metoda přijímá název indexu nebo jeho klíčový vzor jako parametr pro určení, který index se má odkrýt.

Příklad:

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

Výstup:

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

Výstup unhideIndex() metoda zobrazí starou hodnotu pro hidden pole (v tomto případě true ) a novou hodnotu (v tomto případě false ).

Pokud však odkryjeme již neskrytý index (nebo skryjeme již skrytý), tyto se nezobrazí a dostaneme pouze následující:

{ "ok" : 1 }

Bez ohledu na to je index nyní nekrytý.

Znovu zkontrolujte plán dotazů

Spusťte znovu předchozí dotaz, abyste viděli, jak nyní vypadá plán dotazů.

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

Výsledek:

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

Vidíme, že používá IXSCAN , což znamená, že použil index.

Zkontrolujte, zda byl index odkryt

Můžeme použít getIndexes() znovu zkontrolovat, zda byl index odkryt.

db.pets.getIndexes()

Výsledek:

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

Vidíme stejné tři indexy, které jsme viděli v předchozím příkladu, ale tentokrát nevidíme "hidden" : true .

Ale také nevidíme "hidden" : false .

Odkrytí indexu jednoduše odstraní "hidden" : true část z výsledku getIndexes() . hidden možnost je dostupná pouze v případě, že je hodnota true . hidden option je booleovská hodnota, takže můžeme odvodit, že pokud to není "hidden" : true , pak je "hidden" : false .

Nelze skrýt/odkrýt indexy? Zkontrolujte toto nastavení.

mongod featureCompatibilityVersion musí být alespoň 4.4 než budete moci skrýt indexy. Jakmile je však index skrytý, zůstane skrytý i s featureCompatibilityVersion nastaveno na 4.2 na binárních souborech MongoDB 4.4.

Můžete zkontrolovat featureCompatibilityVersion nastavení pomocí následujícího kódu:

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

Můžete jej nastavit pomocí setFeatureCompatibilityVersion příkaz:

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

setFeatureCompatibilityVersion příkaz je třeba spustit v admin databáze.

Pamatujte také, že nemůžete skrýt _id index.


  1. MongoDB $ukázka

  2. Vrátí skutečný typ pole v MongoDB

  3. MongoDB $substrCP

  4. Příklady použití RedisStore v socket.io