database
MongoDB에서 Compound Index(복합 인덱스)는 두 개 이상의 필드를 결합하여 만든 인덱스로, 다차원 쿼리에서 효율적인 검색을 지원합니다. 복합 인덱스는 단일 필드 인덱스만으로는 충족할 수 없는 복잡한 데이터 검색 요구를 해결할 수 있도록 설계되었습니다. 하지만 올바른 순서와 구조로 인덱스를 설계하지 않으면 크리티컬한 성능을 저하가 발생합니다. 이 글에서 Compound Index의 동작 방식, 설계 원칙, 그리고 실무적인 최적화 방법을 알아봅시다.
Compound Index는 여러 필드를 조합하여 인덱스를 생성합니다. 예를 들어, 아래 코드는 a, b, c 세 개의 필드를 기준으로 복합 인덱스를 생성합니다:
// 1. a 필드 기준으로 우선 정렬
// 2. 동일한 a 값 내에서 b 필드 기준으로 정렬
// 3. 동일한 b 값 내에서 c 필드 기준으로 정렬
db.people.createIndex({ a: 1, b: 1, c: 1 })
MongoDB는 인덱스를 B-Tree 구조로 관리하며, Compound Index의 순서는 매우 중요합니다. 각 필드의 정렬 방향(오름차순 1, 내림차순 -1) 또한 쿼리 성능에 영향을 미칩니다.
복합 인덱스는 최대 32개의 필드를 포함할 수 있습니다. 그러나 너무 많은 필드를 포함하면 오히려 성능이 저하될 수 있습니다. 따라서 하나의 collection당 4개 까지만 포함하길 권장합니다. 필드의 순서는 쿼리의 효율성에 직접적인 영향을 미칩니다. 일반적으로
복합 인덱스의 필드 순서는 쿼리 성능에 매우 큰 영향을 미칩니다. 인덱스는 왼쪽에서 오른쪽으로 동작합니다.
db.collection.createIndex({ b: 1, c: 1, a: 1 })
쿼리가 b와 c 필드를 우선적으로 필터링하며, 이후 a 필드를 추가적으로 확인합니다.
db.collection.find({ a: { $gt: 2 }, b: 1, c: 3 })
db.collection.createIndex({ b: 1, c: 1, a: 1 })
범위 조건이 포함된 필드는 인덱스에서 활용 가능한 필드의 범위를 제한합니다. 범위 조건 이후의 필드들은 인덱스 탐색에서 제외될 가능성이 높기 때문에, 따라서 범위 조건이 포함된 필드는 인덱스의 끝 부분에 배치해야 합니다. 범위 조건 ($gt, $lt 등)이 포함된 필드는 인덱스의 순서에 따라 성능에 큰 영향을 미칩니다. 범위 조건 이후에 배치된 필드는 인덱스를 효과적으로 활용하지 못할 가능성이 있습니다. 이를 피하려면, 범위 조건이 포함된 필드를 복합 인덱스의 뒤쪽에 배치해야 합니다.
MongoDB에서 쿼리 조건의 순서(find 내 필드 순서)는 성능에 영향을 미치지 않습니다. MongoDB는 쿼리의 조건을 내부적으로 최적화하여 적절한 순서로 인덱스를 활용합니다. 따라서 아래 두 쿼리는 동일한 성능을 나타냅니다.
db.collection.find({ a: { $gt: 2 }, b: 1, c: 3 });
db.collection.find({ b: 1, c: 3, a: { $gt: 2 } });
Equality 조건(==)은 항상 인덱스의 맨 앞에 배치합니다. Sort 조건은 Equality 조건 다음에 위치해야 합니다. Range 조건(=$gt, $lt)은 마지막에 배치합니다. 예를 들어, 아래와 같이 복합 인덱스를 설계하면 효율적인 검색이 가능합니다:
// a: Equality
// b: Sort
// c: Range
db.collection.createIndex({ a: 1, b: -1, c: 1 })
복합 인덱스에서 필드의 정렬 방향은 통일해야 추가적인 정렬 비용을 줄일 수 있습니다. 정렬 방향이 혼합되면 MongoDB는 정렬 작업을 다시 수행하므로 성능 저하가 발생합니다.
// 정렬 방향 일관성 예시
db.collection.createIndex({ a: 1, b: -1, c: -1 })
// 정렬 쿼리
db.collection.find().sort({ b: -1, c: -1 })
쿼리 로그를 분석하여 가장 많이 사용되는 조건에 맞춰 인덱스를 설계해야 합니다. 따라서 Equality 조건에서 최대한 많은 데이터를 필터링할 수 있도록 설계해야 합니다.
Compound Index는 MongoDB에서 다차원 쿼리를 처리할 때 필수적인 도구입니다. 그러나 잘못된 설계는 성능 저하를 유발할 수 있으므로, 쿼리 패턴과 데이터 구조를 면밀히 분석하여 적합한 인덱스를 설계해야 합니다. MongoDB의 Compound Index를 잘 활용하면, 대규모 데이터 처리에서도 우수한 성능을 달성할 수 있습니다.