이번에는 몽고DB의 인덱스(Index)에 대해 알아보려고 합니다.
1. 인덱스(Index)란?
[몽고DB의 인덱스]
몽고DB의 인덱스도 타 데이터베이스와 같은 개념으로 특정 컬럼으로 정렬된 리스트에서 값을 찾도록 되어있다. 몽고DB의 인덱스는 B-Tree로 이루어져 있다. 몽고디비의 인덱싱 또한 인덱싱 된 필드에 대해 쓰기, 업데이트, 삭제 작업에 대해 시간이 오래 걸린다. 그 이유는 데이터가 변경될 때마다 모든 인덱스를 갱신해줘야 하기 때문이다.
[컬렉션 스캔]
몽고 DB의 인덱스를 사용하지 않으면 컬렉션 스캔을 한다. 컬렉션 스캔이란 내가 찾는 내용에 대해 전체에 대해서 찾아보는 것을 의미한다.
[효율적인 몽고DB 인덱스 방법]
몽고DB 쿼리에 대해 효율적으로 응답하게 하려면 애플리케이션의 모든 쿼리 패턴에 인덱스를 사용해야 한다. 여기서 쿼리 패턴이란 다양한 유형의 쿼리를 의미한다.
2. 단일 인덱스
[단일 인덱스]
db.address.createIndex({"street" : 1})
하나의 필드를 인덱스로 사용하는 것
3. 복합 인덱스
[복합 인덱스]
db.address.createIndex({"street" : 1, "city" : 1})
두개 이상의 필드를 인덱스로 사용하는 것.
몽고DB 완벽가이드에서 복합 인덱스를 설계할 때는 인덱스를 사용할 공통 쿼리 패턴의 동등 필터, 다중값 필터, 정렬 구성 요소를 처리하는 방법을 알아야 한다고 한다. 처리 방법에 대해 요약하자면,
- 동등 필터에 대한 키를 맨 앞에 표시해야 한다
- 정렬에 사용되는 키는 다중값 필드 앞에 표시해야 한다.
- 다중값(범위를 사용한 값 ex) gt, lt) 필터에 대한 키는 마지막에 표시해야 한다.
즉, createIndx(동등 필터, 정렬, 다중 값)이라는 것이 나온다.
4. 몽고 디비가 인덱스를 선택하는 방법
하나의 도큐먼트에 N개의 인덱스가 있고, 도큐먼트에 쿼리를 요청하면 몽고DB는 쿼리 모양을 확인한다. 쿼리 모양에서는 검색할 필드와 정렬 여부 등 추가 정보가 있다. 해당 쿼리 모양을 통하여 쿼리에 충족하는 인덱스 후보 집합을 식별한다고 한다. 즉, 쿼리 레이스라고 이야기한다.
[쿼리 레이스의 순서]
1. 몽고DB가 N개의 인덱스 중 4개의 인덱스 후보를 잡는다.
2. 각 인덱스에 대한 쿼리 플랜을 만든다.
3. 병렬 스레드를 사용하여 쿼리를 실행한다.
4. 가장 빨리 결과를 반환하는 쿼리에 대해서 캐시화하여 쿼리플랜으로 만들어 관리한다.
이때 성공한 플랜은 몽고DB explain에서 winning plan, 그 외 플랜에 대해서는 reject plan으로 나온다.
[쿼리플랜의 유지 시간]
컬렉션과 인덱스(추가, 수정, 삭제)에 대해서 변경 및 몽고DB 프로세스가 재시작하면 삭제된다. 또한 명시적으로 제거할 수 있다.
5.카디널리티
[카디널리티]
각 도큐먼트마다 유일한 값(이름, 이메일)을 가지는 것은 높은 카디널리티를 뜻하며, 성별과 같이 한정적인 필드를 가지는 것을 낮은 카디널리티라고 뜻하며, 나이와 같이 골고루 값을 가지는 것을 중간 카디널리티라고 말한다.
복합 인덱스에서는 높은 카디널리티 키를 낮은 카디널리티 키보다 앞에 놓는 것을 선호한다고 한다.
6. 인덱스를 생성하지 않는 경우
인덱스는 컬렉션에서 가져와야 하는 부분이 많을수록 비효율적이며, 인덱스를 하나 사용하려면 두 번의 조회를 한다. 즉, 최악의 경우 컬렉션 스캔보다 훨씬 느릴 수 있다.
그럼으로써 인덱스는 적절한 타이밍 때 사용해야 한다. 인덱스가 적합한 경우에는 큰 컬렉션, 큰 도큐먼트, 선택적 쿼리인 경우. 인덱스가 적합하지 않은 경우에는 작은 컬렉션, 작은 도큐먼트, 비선택적 쿼리인 경우라고 한다.
요번에는 몽고DB 인덱스에 대해서 알아보았습니다. 몽고DB에 대해 복합키에 대한 사용법이 책에서 나왔었는데, 이 부분을 보고 RDB에서의 복합키에 대한 사용 방법을 다시 찾아봐야되겠다라는 생각이 들었습니다. 대략적인 틀이 있어보이기 때문이었습니다. 다음 시간에는 인덱스에 종류에 대해서 알아보도록 하겠습니다.
'MongoDB' 카테고리의 다른 글
[MongoDB] 몽고DB의 기본(Document, Collection, DataBase, _id) (0) | 2023.01.27 |
---|---|
[MongoDB] 몽고 DB란 무엇일까? (0) | 2023.01.25 |