MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak działa unhideIndex() w MongoDB

W MongoDB db.collection.unhideIndex() metoda odkrywa ukryty indeks.

Ukryty indeks to taki, który jest ukryty przed planerem zapytań. Gdy odkryjesz indeks, nie jest on już ukryty przed planerem zapytań i jest od razu dostępny do użycia.

Przykład

Załóżmy, że mamy kolekcję o nazwie pets i chcemy to sprawdzić pod kątem ukrytych indeksów. Moglibyśmy uruchomić następujące zapytanie, aby zwrócić wszystkie indeksy w kolekcji:

db.pets.getIndexes()

Wynik:

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

Widzimy, że istnieją trzy indeksy. Trzeci jest ukryty. Wiemy to, ponieważ ma "hidden" : true .

Ten indeks ma weight pole. Kiedy uruchamiamy zapytanie przez plan zapytań, który pyta o weight polu, zobaczymy, że nie używa indeksu.

Przykład:

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

Wynik:

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

Widzimy, że wykonał COLLSCAN (skan kolekcji), co oznacza, że ​​nie używał indeksu.

Odkryj indeks

Możemy użyć unhideIndex() metoda, aby odkryć indeks. Ta metoda akceptuje nazwę indeksu lub jego wzorzec klucza jako parametr określający indeks do odkrycia.

Przykład:

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

Wyjście:

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

Wyjście unhideIndex() metoda wyświetla starą wartość dla hidden pole (w tym przypadku true ) i nową wartość (w tym przypadku false ).

Jeśli jednak odkryjemy już nieukryty indeks (lub ukryjemy już ukryty), nie są one wyświetlane i otrzymujemy tylko:

{ "ok" : 1 }

Niezależnie od tego indeks jest teraz nieukryty.

Sprawdź ponownie plan zapytań

Uruchommy ponownie poprzednie zapytanie, aby zobaczyć, jak teraz wygląda plan zapytania.

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

Wynik:

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

Widzimy, że użył IXSCAN , co oznacza, że ​​użył indeksu.

Sprawdź, czy indeks został odkryty

Możemy użyć getIndexes() metodę ponownie, aby sprawdzić, czy indeks został odkryty.

db.pets.getIndexes()

Wynik:

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

Widzimy te same trzy indeksy, które widzieliśmy we wcześniejszym przykładzie, ale tym razem nie widzimy "hidden" : true .

Ale nie widzimy też "hidden" : false .

Odkrycie indeksu po prostu usuwa "hidden" : true część z wyniku getIndexes() . hidden opcja jest dostępna tylko wtedy, gdy wartość to true . hidden opcja jest wartością logiczną, więc możemy wywnioskować, że jeśli nie jest "hidden" : true , to jest "hidden" : false .

Nie możesz ukryć/odkryć indeksów? Sprawdź to ustawienie.

mongod featureCompatibilityVersion musi mieć co najmniej 4.4 zanim będzie można ukryć indeksy. Jednak po ukryciu indeks pozostanie ukryty nawet w przypadku featureCompatibilityVersion ustawiony na 4.2 w plikach binarnych MongoDB 4.4.

Możesz sprawdzić featureCompatibilityVersion ustawienie z następującym kodem:

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

Możesz to ustawić za pomocą setFeatureCompatibilityVersion polecenie:

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

setFeatureCompatibilityVersion polecenie musi być uruchomione w admin baza danych.

Pamiętaj też, że nie możesz ukryć _id indeks.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. loguj w aplikacji wszystkie zapytania odpalane przez mangusty

  2. Używanie MongoDB jako źródła danych w GoLang

  3. Jak połączyć się z mongodb za pomocą sailsjs v0.10?

  4. Projekcja MongoDB zagnieżdżonych tablic

  5. MongoDB $ceil