MongoDB Index에 관하여

Choi Yeonung·2022년 10월 2일
0

MongoDB Index란?

Index는 DB 검색을 빠르게 하기 위해 데이터의 순서를 미리 정리해 두는 과정이다. MongoDB는 고정된 스키마는 없지만, 원하는 데이터 필드를 인덱스로 지정하여 검색 결과를 빠르게 하는 것이 가능하다.

index는 어떤 데이터가 document에 추가되거나 수정될 때 (write) 그 collection에 생성되어 있는 index도 새로운 document를 포함시켜 수정된다. 따라서 index가 많을 경우 write 작업은 느려질 수 있다. index는 read 작업 위주의 application에서 유용하고, 읽기보다 쓰기 작업이 많으면 index를 추가하는 것은 다시 생각해 보아야 한다.

MongoDB Index 종류

MongoDB의 index 종류는 단일 필드 index, 복합 index, 다중 키 index, geospatial index, text index, 해쉬 index, clustered index 등이 존재한다. 이번 포스트에서는 자주 사용되는 single field index와 compound index에 대해서 알아보겠다.

Single Field Index

1개의 필드로 이루어진 인덱스이다.

{score: 1}

위의 인덱스는 score를 기준으로 오름차순으로 정렬된 순서를 가지고 있겠다는 뜻이다. 1 대신 -1을 넣으면 내림차순이다.

MongoDB는 index를 어느 방향으로나 탐색할 수 있으므로, single field index에서는 오름차순이나 내림차순이나 검색에 차이가 없다.

Compound Index

이번엔 한 개가 아닌 여러 개의 필드로 이루어진 compound index에 대해서 알아보겠다. Compound index에서 필드의 순서는 중요하다.

{userid: 1, score: -1}

위와 같이 인덱스가 설정되었다면, index는 userid로 먼저 오름차순 정렬하고, userid가 같은 경우에 score로 내림차순 정렬한 순서를 저장한다.

검색 쿼리에서 compound index를 사용하는 경우 정렬 방향은 index와 일치해야 한다.

# 문제 없이 실행
> db.collection.find({}).sort({userid: 1, score: -1})
> db.collection.find({}).sort({userid: -1, score: 1})

# RAM exceeded error 발생
> db.collection.find({}).sort({userid: 1, score: 1})
> db.collection.find({}).sort({userid: -1, score: -1})
> db.collection.find({}).sort({score: 1, userid: -1})

Index Prefix

Index prefix란 조회 시 왼쪽 인덱스부터 적용되는 부분집합 인덱스를 말한다. Index의 부분집합 중 index prefix만 조회 가능하다.

생성된 인덱스: {a: 1, b: 1, c: 1}
지원되는 쿼리: {a: 1}, {a: 1, b: 1}, {a: 1, b: 1, c: 1}
지원하지 않는 쿼리: {b: 1}, {a: 1, c: 1} 등

Sort 연산은 non-prefix를 지원한다.
생성된 인덱스가 다음이라고 해보자.

{a: 1, b: 1, c: 1, d: 1}

다음은 위 인덱스에 적합한 쿼리이다.

1. db.collection.find({a: -4}).sort({b: 1, c: 1})
2. db.collection.find({b: -4, a: 3}).sort({c: -1})
3. db.collection.find({a: 1, b: {$gt: -3}).sort({b: 1})

1번은 쉽게 생각할 수 있다.
2번은 a와 b의 값을 찾은 다음에 c를 정렬하기 때문에 인덱스를 이용할 수 있다.
3번은 a를 찾고 b의 범위에서 b를 정렬한 순서로 반환하기 때문에 인덱스를 이용할 수 있다.

하지만 다음 쿼리 등은 위 인덱스를 이용할 수 없다.

> db.collection.find({a: {$lt: 0}}).sort({c: -1})
> db.collection.find({c: 10}).sort({c: 1})

Index Intersection

인덱스 교차(index intersection)란 인덱스가 교차해서 쿼리에 자동으로 적용되는 것이다. 예를 들어, 아래 두 인덱스가 개별 생성될 시 아래의 쿼리는 인덱스 교차로 인해 자동으로 인덱스가 적용된다.

index 1: {a: 1}
index 2: {b: -1}

> db.collection.find({b: 5, a: {$gt: 0}})

참고 자료

https://www.mongodb.com/docs/manual/indexes/
https://ryu-e.tistory.com/1

profile
Code as a hobby

0개의 댓글