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.