특정 필드를 정렬하여 조회 성능을 높일 때 사용되는 기능이다.
mongoDB에서는 B-Tree를 사용한다.
- 모든 리프 노드는 같은 레벨에 있다.
- 컬렉션 크기가 작을 때
- 업데이트, 삽입이 빈번할 때
- null값이 많은 필드
한개의 필드로 인덱싱한다.
기본적으로, 모든 컬렉션은 _id 인덱스가 자동으로 생성된다.
- 단일 필드에 대한 오름차순 인덱스 생성
db.컬렉션_이름.createIndex({필드 : 1})
- 단일 필드에 대한 내림차순 인덱스 생성
db.컬렉션_이름.createIndex({필드 : -1})
여러 필드를 결합하여 단일 인덱스를 만든다.
- 필드 1에 대해 오름차순, 필드 2에 대해 내림차순 인덱스 생성
db.컬렉션_이름.createIndex({필드1 : 1, 필드2 : -1})
위 예제에 대해 manufacturer는 오름차순, price는 내림차순으로 하여 compound index를 생성db.products.createIndex(manufacturer:1, price:-1)
중요한 것은, 여러 필드를 결합할 때, 순서를 잘 생각해야 한다는 것이다.
index prefix란, compound index에서 쿼리할 수 있는 부분집합을 의미한다.
위 예제에서db.products.createIndex(product : 1, manufacturer:1, price:-1)
이렇게 compound index를 만들었다면,
- {product : 1}
- {product : 1, manufacturer : 1}
- {product : 1, manufacturer : 1, price : -1}
이렇게 index prefix가 생긴다. 그러면, 첫번째는 사실상 single field index이기 때문에, 이를 잘 활용한다면 single field index를 따로 만들지 않아도 된다.
Equality, Sort, Range 조건으로 조회할 때, ESR rule을 기반으로 compound index를 생성하여 쿼리 성능을 개선할 수 있다.
이 때, ESR 순서로 compound index를 만들어야 한다.
ex)db.cars.find({manufacturer : 'Ford’, cost : {$gt : 10000}}).sort({model : 1})
manufacturer : 'Ford’ -> Equality
cost: { $gt : 10000 } -> Range
sort({model : 1}) -> Sort
==> compound index 생성 (ESR 기반)db.cars.createIndex{manufacturer : 1, model : 1, cost : 1}
필드의 array 값을 인덱싱한다.
- rating 오름차순 정렬
db.inventory.createIndex({ratings: 1})