この投稿では、MongoDBで未使用のインデックスを検索する方法、インデックスコレクションの使用統計を確認する方法、未使用のインデックスを削除する方法を紹介します。
複数のアプリケーションリリースにわたってMongoDBデータベースインデックスを積極的に管理することは、開発チームにとって困難な場合があります。多くの場合、要件はリリースごとに変更され、いくつかの新しいインデックスが追加され、古いインデックスが破棄される可能性があります。時間の経過とともに、これにより、使用されているMongoDBインデックスと、現在不要になっているインデックスを追跡することが困難になります。
インデックスは書き込みパフォーマンスに大きな影響を与えます。コレクションへの書き込みがあるたびに、関連するインデックスを更新する必要があります。インデックスの欠如はすぐに現れ、クエリの速度を低下させます。未使用のインデックスはより微妙であり、書き込みパフォーマンスを向上させるために積極的に削除する必要があります。詳細については、こちらをご覧ください-MongoDBでインデックスを作成する際の危険性
以前のバージョンのMongoDBでは、インデックスが使用されていないかどうかを簡単に判断する方法はありませんでした。ただし、バージョン3.2以降、MongoDBでは$ indexStats演算子のサポートが追加され、インデックスの使用状況に関する統計を収集できるようになりました。
MongoDBで未使用のインデックスを見つける
コレクションの特定のインデックスの使用統計を確認するには、次のコマンドを使用できます:
db.collection.aggregate([{$indexStats: {}}, {$match: {"name": "<indexname>"}}])
コレクションのすべてのインデックスの統計を取得するには:
db.collection.aggregate([{$indexStats:{}}])
返されるドキュメントは次のようになります:
{ "name" : "test", "key" : { "key" : 1 }, "host" : "xxx:27017", "accesses" : { "ops" : NumberLong(145), "since" : ISODate("2017-11-25T16:21:36.285Z") } }
ここで注意すべき2つの重要なフィールドは次のとおりです。
-
操作
これは、インデックスを使用した操作の数です。
-
以降
これは、MongoDBが統計を収集した時間であり、通常は最後の開始時間です。
MongoDBで未使用のインデックスを削除する
未使用のMongoDBインデックスを特定して検証したら、以下のコードを使用してインデックスを削除できます。
db.collection.dropIndex( "<index name>"); or db.collection.dropIndex("{key1:1.....}")
いつものように、ドロップ操作を続行する前に、正しいインデックスをドロップしていることを確認してください。
MongoDBで未使用のインデックスを見つけることについて質問がある場合は、以下にコメントを残すか、[email protected]までご連絡ください。