본문 바로가기
데이터베이스/MongoDB

[MongoDB] 인덱스 검색, 인덱스 정렬 방식에 따른 검색속도 차이

by minhyeok.lee 2023. 3. 20.
반응형

[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 인덱스

반응형

댓글