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
を非表示にすることはできません。 インデックス。