[MongoDB] 인덱스 검색, 인덱스 정렬 방식에 따른 검색 및 정렬 빠르게 하는 방법
각 명령어의 출력시간은 explain.executionStats를 사용하여 실행속도를 확인하였다.
2023.03.06 - [데이터베이스/MongoDB] - [MongoDB] 빠른 탐색을 위한 인덱싱(indexing)
[MongoDB] 빠른 탐색을 위한 인덱싱(indexing)
NestJS(typegoose)에서 MongoDB를 빠르게 탐색하기 위해 인덱스를 사용하는 방법, explain.executionStats를 사용하여 실행속도 확인 아래와 같이 십만개(100,000)의 더미 유저 데이터가 있다. 데이터의 형식은 1
kfdd6630.tistory.com
1. 인덱스 순서와 검색에 있어서 검색은 정렬에 비해 인덱스 순서가 중요하지 않다.
2. 인덱스 순서와 정렬에 있어서 정렬은 인덱스 순서가 중요하다.
쿼리를 할 때의 순서와 마찬가지로 정렬을 할 때에도 순서는 중요하다.
만약 {a : 1, b : 1} 의 형태로 정의된 인덱스가 있다면 정렬을 할 때, 그 순서가 지켜져야 한다.
db.collection.createIndex({ a: 1, b: 1 })
// 성능차이가 존재하지 않는다.
db.collection.find({ a: 1, b: 1 }).sort() // 탐색순서 순서지킴
db.collection.find({ b: 1, a: 1 }).sort() // 탐색순서 순서 안지킴
// 성능차이가 존재한다.
db.collection.find().sort({ a: 1, b: 1 }) // 정렬순서 순서지킴
db.collection.find().sort({ b: 1, a: 1 }) // 정렬순서 순서 안지킴
만약 { a : 1, b : 1 } 의 형태로 정의된 인덱스가 있다면 정렬을 할 때에도 그 순서가 지켜져야 한다.
만약 { a : 1, b : 1 } 의 형태로 정의된 인덱스가 있다면 검색을 할 때에도 그 순서가 아래 출력 값에서는 의미가 없는 듯 하지만 되도록 맞춰 적는 것을 지향한다.
출력값은 다음과 같다.

컴파운드 인덱스에서 인덱스의 정렬방향 또한 중요하다.
db.collection.createIndex({ a: 1, b: -1 })
// 성능이 좋다
db.collection.find().sort({ a: 1, b: -1 })
db.collection.find().sort({ a: -1, b: 1 })
// 성능이 좋지 않다
db.collection.find().sort({ a: 1, b: 1 })
db.collection.find().sort({ a: -1, b: -1 })
오름차순 1과 내림차순 -1의 정렬 순서가 인덱스의 정렬된 순서와 방향이 동일해야 성능이 좋다.
- 전체적인 방향이 정방향, 역방향으로 같으면 된다.
index에서 _id:1, _createdAt: 1일 때, 각 정렬방향에 대한 출력값은 다음과 같다.

단일 인덱스가 오름차순, 내림차순의 구분 없이 좋은 인덱스 효과를 낼 수 있었던 것은 일렬로 나열된 데이터 구조때문이다.
컴파운드 인덱스는 구성하는 키들의 방향은 서로 다르더라도 데이터 구조는 일렬로 나열되어 있다.
각 키의 방향 조합만 제대로 유지해주면 단 한번의 스캔으로 검색이 가능하기 때문에 인덱스의 효과를 누릴 수가 있다.
* 참고: 점 표기법을 이용한 포함된 필드의 인덱스를 사용하면 순서가 반대방향이 더 빠르게 출력된다.
index에서 userBase.Role:1, userBase.name: 1일 때, 각 정렬방향에 대한 출력값은 다음과 같다.

위 두 출력값에 대한 MongoDB의 컴파운드 인덱스는 아래와 같다.

'데이터베이스 > MongoDB' 카테고리의 다른 글
[MongoDB] 인덱스 교차 (Index Interserction) (0) | 2023.03.20 |
---|---|
[MongoDB] 접두사 인덱스, 등치 (Index Prefix, Equality)란? (0) | 2023.03.20 |
[MongoDB] Single Field Indexes, Compound Index (단일 인덱스, 복합 인덱스) (0) | 2023.03.14 |
[MongoDB] 인덱스(index)란? 인덱스 설계 시 고려할 점 (0) | 2023.03.13 |
[MongoDB] $elemMatch (query) (0) | 2023.03.10 |
댓글