不要なインデックスの削除
すべてのクエリにインデックスを作成すると、不要なインデックスが発生し、データベースのパフォーマンスが低下する可能性があります。 不要なインデックスはほとんど使用されない、別の複合インデックスで冗長な、またはまったく使用されない場合があります。 データベースのパフォーマンスを最適化するには、使用するインデックス数を最小限に抑えることが重要です。 不要なインデックスを識別して排除し、クエリの実行とリソースの効率的な使用を維持します。
このタスクについて
次の courses
コレクションについて考えてみましょう。各ドキュメントには異なる学校のコースに関する情報が保存されています。
// Biology course document db.courses.insertOne( { _id: 1, course_name: "Biology 101", professor: "Tate", semester: "Fall", days: "Monday, Friday", time: "12:00", building: "Olson" } )
courses
コレクションにはすべてのフィールドのインデックスがあります。
_id
はデフォルトでインデックス付きです{ course_name: 1 }
{ professor: 1 }
{ semester: 1 }
{ building: 1 }
{ days: 1 }
{ time: 1 }
{ day: 1, time: 1 }
コレクション内のすべてのフィールドにインデックスを作成すると、コレクションが肥大化する可能性があり、書込みパフォーマンスに悪影響を影響可能性があります。
手順
インデックスの使用を評価する
どのインデックスがほとんど使用されないかを判断するには、 $indexStats
集計ステージを使用します。
db.courses.aggregate( [ { $indexStats: { } } ] )
この操作では、以下を返します。
[ { name: "building_1", key: { "building": 1 }, host: "M-C02FJ3BDML85:27017", accesses: { "ops": "Long('0')", "since": "ISODate('2024-06-24T17:35:00.000Z')" }, spec: { "v": 2, "key": { "building": 1 }, "name": "building_1" } }, { name: "day_1", key: { "day": 1 }, host: "M-C02FJ3BDML85:27017", accesses: { "ops": "Long('1')", "since": "ISODate('2024-06-24T17:35:30.000Z')" }, spec: { "v": 2, "key": { "day": 1 }, "name": "day_1" } }, { name: "time_1", key: { "time": 1 }, host: "M-C02FJ3BDML85:27017", accesses: { "ops": "Long('1')", "since": "ISODate('2024-06-24T17:36:00.000Z')" }, spec: { "v": 2, "key": { "time": 1 }, "name": "time_1" } }, { name: "day_1_time_1", key: { "day": 1, "time": 1 }, host: "M-C02FJ3BDML85:27017", accesses: { "ops": "Long('110')", "since": "ISODate('2024-06-24T17:31:21.800Z')" }, spec: { "v": 2, "key": { "day": 1, "time": 1 }, "name": "day_1_time_1" } }, { name: "_id_", key: { "_id": 1 }, host: "M-C02FJ3BDML85:27017", accesses: { "ops": "Long('150')", "since": "ISODate('2024-06-24T15:31:49.463Z')" }, spec: { "v": 2, "key": { "_id": 1 }, "name": "_id_" } }, { name: "course_name_1", key: { "course_name": 1 }, host: "M-C02FJ3BDML85:27017", accesses: { "ops": "Long('120')", "since": "ISODate('2024-06-24T17:29:26.344Z')" }, spec: { "v": 2, "key": { "course_name": 1 }, "name": "course_name_1" } }, ... ]
building_1
インデックスは、accesses
カウントがゼロであることが示すように、どのクエリにも使用されていないため削除できます。複合インデックス
{ day: 1, time: 1 }
は時間関連のクエリをカバーするため、{ days: 1 }
インデックスと{ time: 1 }
インデックスを削除できます。
また、 MongoDB Atlas Performance Advisor (M 10以上で利用可能)とMongoDB Compassを使用して、不要なインデックスを決定、非表示、削除することもできます。
Hide Indexes
不要なインデックスを識別した後、 db.collection.hideIndex()
メソッドを使用してインデックスを非表示にし、削除する前にデータベースへの影響を評価できます。
db.courses.hideIndex( "days_1" ) db.courses.hideIndex( "time_1" ) db.courses.hideIndex( "building_1" )
インデックスの削除
インデックスが不要で、パフォーマンスに影響が及ぶと判断した場合は、 db.collection.dropIndexes()
メソッドを使用してインデックスを削除します。
db.courses.dropIndexes( [ "days_1", "time_1", "building_1" ] )
この例では 、次のインデックスのみが残ります。これらは最も頻繁に使用され、クエリの最適化に役立つためです。
_id
はデフォルトでインデックス付きです{ course_name: 1 }
{ professor: 1 }
{ semester: 1 }
{ day: 1, time: 1 }