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

Jak funguje hideIndex() v MongoDB

MongoDB představil db.collection.hideIndex() metoda v MongoDB 4.4.

Tato metoda skryje existující index z plánovače dotazů. To vám umožní vyhodnotit potenciální dopad vypuštění indexu, aniž byste index skutečně vypustili.

Pokud má skrytí negativní dopad, můžete použít db.collection.unhideIndex() pro odkrytí indexu. To vám ušetří nutnost rušit index a poté jej znovu vytvářet.

Příklad

Předpokládejme, že máme sbírku nazvanou pets . Vraťme aktuální indexy této kolekce.

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, že má tři indexy. Vyberme třetí s názvem idx_weight_-1 pro náš příklad.

Nejprve se podívejme, jak vypadá plán dotazů, když spouštíme dotazy, které používají tento index.

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

Zde hledáme mazlíčky, které překračují určitou váhu. Používáme explain() metoda k zobrazení plánu dotazů namísto skutečných výsledků.

Takto vypadá plán dotazů pro tento dotaz:

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

Nyní skryjme index.

Skrýt rejstřík

Zde je hideIndex() Můžeme jej použít ke skrytí indexu, aby se nezobrazoval v plánu dotazů jako v předchozím příkladu.

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

Výstup:

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

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

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

{ "ok" : 1 }

V každém případě je index nyní skrytý.

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" : "COLLSCAN",
			"filter" : {
				"weight" : {
					"$gt" : 10
				}
			},
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	},
	"ok" : 1
}

Tentokrát dostaneme COLLSCAN , což znamená, že nepoužil index – provedl skenování kolekce.

Zkontrolujte, zda je index skrytý

Můžete použít getIndexes() metoda pro kontrolu, zda je index skrytý.

Můžeme tedy spustit stejný dotaz, který jsme spustili dříve, abychom vrátili všechny indexy:

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

Nelze skrý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. Odkazování na jiné dokumenty pomocí řetězce spíše než ObjectId

  2. Mongodb počítá všechny prvky pole ve všech objektech odpovídajících kritériím

  3. Filtrujte podpole pole podle některých kritérií

  4. Mongodb, sharding a služby pro více oken