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

Jak działa hideIndex() w MongoDB?

MongoDB wprowadził db.collection.hideIndex() metoda w MongoDB 4.4.

Ta metoda ukrywa istniejący indeks przed planerem zapytań. Pozwala to ocenić potencjalny wpływ porzucenia indeksu bez faktycznego porzucania indeksu.

Jeśli ukrywanie go ma negatywny wpływ, możesz użyć db.collection.unhideIndex() aby odkryć indeks. Dzięki temu nie musisz usuwać indeksu, a następnie go odtwarzać.

Przykład

Załóżmy, że mamy kolekcję o nazwie pets . Zwróćmy aktualne indeksy tej 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"
	}
]

Widzimy, że ma trzy indeksy. Wybierzmy trzeci o nazwie idx_weight_-1 dla naszego przykładu.

Najpierw zobaczmy, jak wygląda plan zapytań, gdy uruchamiamy zapytania korzystające z tego indeksu.

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

Tutaj szukamy zwierząt domowych, które przekraczają określoną wagę. Używamy explain() metoda wyświetlania planu zapytania zamiast rzeczywistych wyników.

Oto jak wygląda plan zapytań dla tego zapytania:

{
	"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żywa IXSCAN co oznacza, że ​​użył indeksu.

Teraz ukryjmy indeks.

Ukryj indeks

To tutaj hideIndex() wejdzie. Możemy go użyć do ukrycia indeksu, aby nie pojawił się w planie zapytania, tak jak w poprzednim przykładzie.

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

Wyjście:

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

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

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

{ "ok" : 1 }

W każdym razie indeks jest teraz ukryty.

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

Tym razem otrzymujemy COLLSCAN , co oznacza, że ​​nie użył indeksu – wykonał skanowanie kolekcji.

Sprawdź, czy indeks jest ukryty

Możesz użyć getIndexes() metoda sprawdzania, czy indeks jest ukryty.

Możemy więc uruchomić to samo zapytanie, które wykonaliśmy wcześniej, aby zwrócić wszystkie indeksy:

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

Nie możesz ukryć 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. Czy usunięcie pliku dziennika mongodb jest bezpieczne?

  2. Co to jest TransientTransactionError w Mongoose (lub MongoDB)?

  3. Filtrowanie osadzonych dokumentów w MongoDB

  4. Zaktualizuj tablicę z wieloma warunkami w mongodb

  5. Jak używać kombinacji $unset i $set w mongoDB