MongoDB memperkenalkan db.collection.hideIndex()
metode di MongoDB 4.4.
Metode ini menyembunyikan indeks yang ada dari perencana kueri. Ini memungkinkan Anda mengevaluasi dampak potensial dari penurunan indeks tanpa benar-benar menjatuhkan indeks.
Jika menyembunyikannya berdampak negatif, Anda dapat menggunakan db.collection.unhideIndex()
untuk menampilkan indeks. Ini menyelamatkan Anda dari keharusan menjatuhkan indeks, lalu membuatnya kembali.
Contoh
Misalkan kita memiliki koleksi yang disebut pets
. Mari kembalikan indeks saat ini pada koleksi itu.
db.pets.getIndexes()
Hasil:
[ { "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" } ]
Kita dapat melihat bahwa ia memiliki tiga indeks. Mari kita pilih yang ketiga bernama idx_weight_-1
untuk contoh kita.
Pertama, mari kita lihat seperti apa rencana kueri saat menjalankan kueri yang menggunakan indeks itu.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Di sini, kami mencari hewan peliharaan yang beratnya lebih dari tertentu. Kami menggunakan explain()
metode untuk menampilkan rencana kueri alih-alih hasil aktual.
Berikut tampilan rencana kueri untuk kueri ini:
{ "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 }
Kita dapat melihat bahwa ia menggunakan IXSCAN
yang berarti menggunakan index.
Sekarang mari kita sembunyikan indeksnya.
Sembunyikan Indeks
Di sinilah hideIndex()
masuk. Kita dapat menggunakannya untuk menyembunyikan indeks sehingga tidak muncul pada rencana kueri seperti pada contoh sebelumnya.
db.pets.hideIndex("idx_weight_-1")
Keluaran:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
Keluaran dari hideIndex()
metode menampilkan nilai lama untuk hidden
bidang (dalam hal ini false
) dan nilai baru (dalam hal ini true
).
Namun, jika kami menyembunyikan indeks yang sudah disembunyikan (atau menampilkan yang sudah tidak disembunyikan), ini tidak akan ditampilkan, dan kami hanya mendapatkan yang berikut:
{ "ok" : 1 }
Bagaimanapun, indeks sekarang disembunyikan.
Periksa Ulang Paket Kueri
Mari kita jalankan kembali kueri sebelumnya untuk melihat seperti apa rencana kueri sekarang.
db.pets.find( { weight: { $gt: 10 } } ).explain()
Hasil:
{ "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 }
Kali ini kita mendapatkan COLLSCAN
, yang berarti tidak menggunakan indeks – ia melakukan pemindaian koleksi.
Periksa Apakah Indeks Tersembunyi
Anda dapat menggunakan getIndexes()
metode untuk memeriksa apakah suatu indeks disembunyikan atau tidak.
Jadi, kita dapat menjalankan kueri yang sama yang kita jalankan sebelumnya untuk mengembalikan semua indeks:
db.pets.getIndexes()
Hasil:
[ { "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 } ]
Tidak Dapat Menyembunyikan Indeks? Periksa Setelan ini.
mongod
featureCompatibilityVersion
minimal harus 4.4
sebelum Anda dapat menyembunyikan index. Namun, setelah disembunyikan, indeks akan tetap tersembunyi bahkan dengan featureCompatibilityVersion
setel ke 4.2 pada binari MongoDB 4.4.
Anda dapat memeriksa featureCompatibilityVersion
setting dengan kode berikut:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
Anda dapat mengaturnya menggunakan setFeatureCompatibilityVersion
perintah:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
setFeatureCompatibilityVersion
perintah harus dijalankan di admin
basis data.
Perhatikan juga, Anda tidak dapat menyembunyikan _id
indeks.