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 }

컬렉션의 모든 필드 에 인덱스를 만들면 컬렉션 이 비대해지고 쓰기 (write) 성능에 부정적인 영향 을 미칠 수 있습니다.

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 카운트가 0으로 표시되는 것처럼 어떤 쿼리에도 사용되지 않으므로 삭제될 수 있습니다.

  • 복합 인덱스 { day: 1, time: 1 } 는 시간 관련 쿼리를 다루기 때문에 { days: 1 }{ time: 1 } 인덱스는 삭제될 수 있습니다.

또한 MongoDB Atlas Performance Advisor (M10 클러스터 이상에서 사용 가능) 및 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 }

돌아가기

컬렉션 수 줄이기