Hidden Indexes
非表示のインデックスはクエリ プランナーには表示されず、クエリのサポートに使用することはできません。
プランナーからインデックスを非表示にすることで、実際にインデックスを削除せずに、インデックスを削除した場合の潜在的な影響を評価できます。 影響がマイナスの場合は、削除されたインデックスを再度作成する必要がある代わりに、インデックスを再表示できます。
動作
プランナーから非表示になることは別として、非表示のインデックスは表示されていないインデックスと同様に動作します。すなわち
非表示インデックスが一意なインデックスである場合、インデックスは引き続きドキュメントに一意の制約を適用します。
非表示インデックスがTTL インデックスの場合、そのインデックスではドキュメントは期限切れのままになります。
非表示インデックスは、
listIndexes
とdb.collection.getIndexes()
の結果に含まれます。非表示のインデックスはコレクションへの書込み (write) 操作時にアップデートされ、ディスク領域とメモリを引き続き消費します。 そのため、
db.collection.stats()
や$indexStats
などのさまざまな統計操作に含まれています。非表示でないインデックスを非表示にするか、非表示のインデックスを表示すると、その
$indexStats
がリセットされます。 すでに非表示になっているインデックスを非表示にするか、すでに非表示になっていないインデックスを表示しても、$indexStats
はリセットされません。
制限事項
インデックスを非表示にするには、featureCompatibilityVersion を
5.0
以上に設定する必要があります。_id
インデックスは非表示にできません。非表示インデックスを
cursor.hint()
することはできません。
例
非表示インデックスの作成
hidden
インデックスを作成するには、db.collection.createIndex()
非表示 オプションを に設定したtrue
メソッドを使用します。
注意
db.collection.createIndex()
でhidden
オプションを使用するには、 featureCompatibilityVersionを5.0
以上に設定する必要があります。
たとえば、次の操作は、 borough
フィールドに非表示の昇順インデックスを作成します。
db.addresses.createIndex( { borough: 1 }, { hidden: true } );
確認するには、 addresses
コレクションでdb.collection.getIndexes()
を実行します。
db.addresses.getIndexes()
この操作では、次の情報が返されます。
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "borough" : 1 }, "name" : "borough_1", "hidden" : true } ]
インデックス オプションhidden
は、値がtrue
の場合にのみ返されます。
既存のインデックスの非表示
注意
インデックスを非表示にするには、featureCompatibilityVersion を
5.0
以上に設定する必要があります。_id
インデックスは非表示にできません。
既存のインデックスを非表示にするには、 collMod
コマンドまたはmongosh
ヘルパーdb.collection.hideIndex()
を使用できます。
たとえば、非表示にすることなくインデックスを作成します。
db.restaurants.createIndex( { borough: 1, ratings: 1 } );
インデックスを非表示にするには、次のいずれかを指定します。
インデックスキー仕様ドキュメントを
db.collection.hideIndex()
メソッドに渡す追加操作db.restaurants.hideIndex( { borough: 1, ratings: 1 } ); // Specify the index key specification document インデックス名を
db.collection.hideIndex()
メソッドに渡すことで、db.restaurants.hideIndex( "borough_1_ratings_1" ); // Specify the index name
確認するには、 restaurants
コレクションでdb.collection.getIndexes()
を実行します。
db.restaurants.getIndexes()
この操作では、次の情報が返されます。
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "borough" : 1, "ratings" : 1 }, "name" : "borough_1_ratings_1", "hidden" : true } ]
インデックス オプションhidden
は、値がtrue
の場合にのみ返されます。
既存のインデックスの再表示
非表示のインデックスを再表示するには、 collMod
コマンドまたはmongosh
ヘルパーdb.collection.unhideIndex()
を使用できます。 次のいずれかを指定できます。
インデックスキー仕様ドキュメントを
db.collection.unhideIndex()
メソッドに渡す追加操作db.restaurants.unhideIndex( { borough: 1, city: 1 } ); // Specify the index key specification document インデックス名を
db.collection.unhideIndex()
メソッドに渡すことで、db.restaurants.unhideIndex( "borough_1_ratings_1" ); // Specify the index name
確認するには、 restaurants
コレクションでdb.collection.getIndexes()
を実行します。
db.restaurants.getIndexes()
この操作では、次の情報が返されます。
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "borough" : 1, "ratings" : 1 }, "name" : "borough_1_ratings_1" } ]
インデックス オプションhidden
は、値がtrue
の場合にのみ フィールドが返されるため、 borough_1_ratings_1
インデックスの一部として表示されなくなりました。
インデックスは非表示の間で完全に維持されているため、非表示が解除されたらすぐに使用できるようになります。