MongoDB 4.4以降、クエリプランからインデックスを非表示にできるようになりました。これにより、実際にインデックスを削除せずに、インデックスを削除した場合の潜在的な影響を評価できます。
非表示にすると悪影響がある場合は、インデックスを再表示できます。これにより、インデックスを削除してから再作成する必要がなくなります。
以下は、MongoDBでインデックスを非表示にする3つの方法です。
hideIndex() 方法
db.collection.hideIndex() メソッドは、約束どおりに機能します。インデックスを(クエリプランナーから)非表示にします。
例:
db.pets.hideIndex("idx_weight_-1") 出力:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
これにより、idx_weight_-1というインデックスが非表示になります。 pets コレクション。または、名前の代わりにインデックスのキーパターンを指定することもできます。
hideIndex()の出力 メソッドは、hiddenの古い値を表示します フィールド(この場合はfalse )と新しい値(この場合はtrue 。
ただし、すでに非表示になっているインデックスを非表示にした場合(または、すでに非表示になっていないインデックスを再表示した場合)、これらは表示されず、次のようになります。
{ "ok" : 1 } いずれの場合も、インデックスは非表示になります。
hideIndex() メソッドは実際にはcollModのラッパーです 管理コマンド(下記)。
collMod コマンド
collMod 管理コマンドを使用すると、コレクションにオプションを追加したり、ビュー定義を変更したりできます。
hidden: trueを渡すことで、インデックスを非表示にするために使用できます 。
例:
db.runCommand( {
collMod: "pets",
index: {
name: "idx_weight_-1",
hidden: true
}
} ) 結果:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
これにより、hideIndex()と同じドキュメントが返されます。 戻ります。
hideIndex()に似ています 、インデックス名またはそのキーパターンを指定するオプションがあります。
キーパターンの使用例は次のとおりです。
db.runCommand( {
collMod: "pets",
index: {
keyPattern: { weight : -1 },
hidden: true
}
} )
この場合、インデックスは{ weight : -1 }を使用して定義されました。 、したがって、この定義をインデックス名の代わりに使用できます。
これを確認するには、getIndexes()を使用できます インデックスの定義を確認するには:
db.pets.getIndexes() 結果:
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"weight" : -1
},
"name" : "idx_weight_-1",
"hidden" : true
}
]
hidden: falseを渡すことで、インデックスを再表示することもできます 。
非表示のインデックスを作成する
インデックスを非表示にする3番目の方法は、非表示のインデックスとして作成することです。
これを行うには、hidden: trueを使用します インデックスを作成するときのオプションの1つとして。
例:
db.pets.createIndex(
{ type: 1 },
{ hidden: true }
) 出力:
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
それでは、getIndexes()を呼び出しましょう。 新しく作成した非表示のインデックスをもう一度確認します:
db.pets.getIndexes() 結果:
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_"
},
{
"v" : 2,
"key" : {
"weight" : -1
},
"name" : "idx_weight_-1",
"hidden" : true
},
{
"v" : 2,
"hidden" : true,
"key" : {
"type" : 1
},
"name" : "type_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を非表示にすることはできません。 インデックス。