불필요한 인덱스 제거
모든 쿼리 에 대해 인덱스를 생성하면 불필요한 인덱스가 생성되어 데이터베이스 성능이 저하될 수 있습니다. 불필요한 인덱스는 거의 사용되지 않거나, 다른 복합 인덱스 의 적용으로 인해 중복되거나, 전혀 사용되지 않을 수 있습니다. 데이터베이스 성능을 최적화하려면 사용하는 인덱스 수를 최소화하는 것이 중요합니다. 불필요한 인덱스를 식별하고 제거 하여 효율적인 쿼리 실행과 리소스 사용을 유지합니다.
이 작업에 대하여
각 문서 가 다른 학교 과정에 대한 정보를 저장하는 다음 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 }
컬렉션의 모든 필드 에 인덱스를 만들면 컬렉션 이 비대해지고 쓰기 (write) 성능에 부정적인 영향 을 미칠 수 있습니다.
단계
인덱스 사용 평가
거의 사용되지 않는 인덱스를 확인하려면 $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
카운트가 0으로 표시되는 것처럼 어떤 쿼리에도 사용되지 않으므로 삭제될 수 있습니다.복합 인덱스
{ day: 1, time: 1 }
는 시간 관련 쿼리를 다루기 때문에{ days: 1 }
및{ time: 1 }
인덱스는 삭제될 수 있습니다.
또한 MongoDB Atlas Performance Advisor (M10 클러스터 이상에서 사용 가능) 및 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 }