Docs Menu
Docs Home
/
MongoDB マニュアル
/ /

不要なインデックスの削除

項目一覧

  • このタスクについて
  • 手順
  • インデックスの使用を評価する
  • Hide Indexes
  • インデックスの削除
  • 詳細

すべてのクエリにインデックスを作成すると、不要なインデックスが発生し、データベースのパフォーマンスが低下する可能性があります。不要なインデックスはほとんど使用されない、別の複合インデックスで冗長な、またはまったく使用されない場合があります。データベースのパフォーマンスを最適化するには、使用するインデックス数を最小限に抑えることが重要です。不要なインデックスを識別して排除し、クエリの実行とリソースの効率的な使用を維持します。

次の 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 }

コレクション内のすべてのフィールドにインデックスを作成すると、コレクションが肥大化する可能性があり、書込みパフォーマンスに悪影響を影響可能性があります。

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を使用して、不要なインデックスを決定、非表示、削除することもできます。

2

不要なインデックスを識別した後、 db.collection.hideIndex()メソッドを使用してインデックスを非表示にし、削除する前にデータベースへの影響を評価できます。

db.courses.hideIndex( "days_1" )
db.courses.hideIndex( "time_1" )
db.courses.hideIndex( "building_1" )
3

インデックスが不要で、パフォーマンスに影響が及ぶと判断した場合は、 db.collection.dropIndexes()メソッドを使用してインデックスを削除します。

db.courses.dropIndexes( [ "days_1", "time_1", "building_1" ] )

この例では 、次のインデックスのみが残ります。これらは最も頻繁に使用され、クエリの最適化に役立つためです。

  • _id はデフォルトでインデックス付きです

  • { course_name: 1 }

  • { professor: 1 }

  • { semester: 1 }

  • { day: 1, time: 1 }

戻る

コレクションの数を減らす