MongoDBはdb.collection.hideIndex()を導入しました MongoDB4.4のメソッド。
このメソッドは、クエリプランナーから既存のインデックスを非表示にします。これにより、実際にインデックスを削除せずに、インデックスを削除した場合の潜在的な影響を評価できます。
非表示にすると悪影響がある場合は、db.collection.unhideIndex()を使用できます。 インデックスを再表示します。これにより、インデックスを削除してから再作成する必要がなくなります。
例
petsというコレクションがあるとします。 。そのコレクションの現在のインデックスを返しましょう。
db.pets.getIndexes() 結果:
[
{
"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"
}
]
3つのインデックスがあることがわかります。 idx_weight_-1という3番目のものを選択しましょう この例では。
まず、そのインデックスを使用するクエリを実行すると、クエリプランがどのようになるかを見てみましょう。
db.pets.find( { weight: { $gt: 10 } } ).explain()
ここでは、特定の体重を超えるペットを探しています。 explain()を使用しています 実際の結果の代わりにクエリプランを表示する方法。
このクエリのクエリプランは次のようになります。
{
"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
}
IXSCANを使用していることがわかります これは、インデックスを使用したことを意味します。
それでは、インデックスを非表示にしましょう。
インデックスを非表示にする
ここでhideIndex() 前の例のようにクエリプランに表示されないように、インデックスを非表示にするために使用できます。
db.pets.hideIndex("idx_weight_-1") 出力:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
hideIndex()の出力 メソッドは、hiddenの古い値を表示します フィールド(この場合はfalse )と新しい値(この場合はtrue 。
ただし、すでに非表示になっているインデックスを非表示にした場合(または、すでに非表示になっていないインデックスを再表示した場合)、これらは表示されず、次のようになります。
{ "ok" : 1 } いずれの場合も、インデックスは非表示になります。
クエリプランを再確認する
前のクエリを再実行して、クエリプランが現在どのようになっているのかを確認しましょう。
db.pets.find( { weight: { $gt: 10 } } ).explain() 結果:
{
"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
}
今回はCOLLSCANを取得します 、つまり、インデックスを使用せず、コレクションスキャンを実行しました。
インデックスが非表示になっているかどうかを確認する
getIndexes()を使用できます インデックスが非表示になっているかどうかを確認するメソッド。
したがって、前に実行したのと同じクエリを実行して、すべてのインデックスを返すことができます。
db.pets.getIndexes() 結果:
[
{
"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
}
] インデックスを非表示にできませんか?この設定を確認してください。
mongod featureCompatibilityVersion 少なくとも4.4である必要があります インデックスを非表示にする前に。ただし、一度非表示にすると、featureCompatibilityVersionを使用してもインデックスは非表示のままになります MongoDB4.4バイナリでは4.2に設定されています。
featureCompatibilityVersionを確認できます 次のコードで設定します:
db.adminCommand(
{
getParameter: 1,
featureCompatibilityVersion: 1
}
)
setFeatureCompatibilityVersionを使用して設定できます コマンド:
db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )
setFeatureCompatibilityVersion コマンドはadminで実行する必要があります データベース。
また、_idを非表示にすることはできません。 インデックス。