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

[MongoDB] 인덱스(index)란? 인덱스 설계 시 고려할 점

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

[MongoDB] 인덱스(index)란? 인덱스 설계 시 고려할 점

 

인덱스(index)란?

1. index는 우리 말로 색인이라 한다.

2. 데이터베이스의 인덱스는 원하는 정보를 빨리 찾을 수 있도록 돕는 색인의 역할을 한다.

3. 영어사전에서 a, b, c ... 알파벳 순서대로 정렬이 되어있듯이 인덱스도 순서가 있는 무언가로 정렬되어 있다.

4. 작은 숫자에서 큰 숫자 혹은 반대 즉, 정방향이든 역방향이든 무언가로 정렬이 되어있다.

 

index가 왜 필요할까?

1. 정렬기준, 정렬조건을 알고 있다면 전화번호부, 책, 사전등에서 내가 원하는 정보가 어디쯤 있을지 예상이 가능하다.

2. 인덱스가 없이 정렬되지 않고 작성되어있는 책, 사전이라면 찾는 정보가 어디쯤 있을 지 예상하지 못한채 하나하나 찾아야 한다.

3. 2의 경우에서 최악의 경우에는 찾는 정보가 마지막에 있어 맨 마지막 페이지까지 찾아야할수도 있다.

 

index 설게시 고려할 점

인덱스를 설계하기 이전에 생각해보면 좋은 점

1. 데이터를 어떤 형태로 어느정도 저장이 될것인가?

 - DB에 저장되는 데이터의 타입은 어떻게 되고 객체라면 어떤 형태의 객체인지 명시가 다 되어 있어야 한다.

 - 내가 가진 데이터의 양은 어느정도 이고 데이터가 들어오는 양이 일정한지 고려해본다.

 

2. 내가 가지고 있는 데이터베이스의 특성이 뭔지?

 - READ를 많이하는 DB인지? Write를 많이하는 DB인지?

데이터 베이스에 Write가 많은 데이터베이스는 인덱스를 복잡하게 설정하면 성능이 나쁠 수 있다.

 - DB의 메모리 크기가 충분한지?

인덱스는 실제 데이터와 별개의 메모리 공간에 저장을 하므로 인덱스를 많이 만들다 보면 그 만큼 많은 메모리를 사용하게 된다.

데이터 베이스가 정상적으로 동작하기 위해서는 그 외에도 working set이라는 데이터 구조도 메모리를 점유하게 된다.

그렇기에 메모리가 부족하지 않게 주의를 기울여야 한다.

 

3. 이런 데이터들을 효과적으로 검색하려면 어떤 키들을 어떤 순서로 정렬해두어야 할지 생각해봐야한다.

- index 설계를 세밀하게 하여 selectivity를 높여야 한다.

예를 들면 영어사전을 명사, 동사로 구분한다면 내가 찾는 단어를 명사인지? 동사인지? 선택만 가능하고 이후에는 하나하나 찾아야 한다.

이처럼 DB인덱스를 설계하면 잘못된 index 설계로 너무 큰 범위로 만들어진 index로 인해 selectivity가 떨어진다.

 

MongoDB에서 index 사용 시 주의점

1. 상황에 따라 다르지만 일반적으로 컬렉션에 2~3개 이상의 인덱스를 가지지 않는 것이 좋다.

인덱스가 많을 수록 Write작업이 오래걸린다.

왜나하면 데이터가 변경될 시 인덱스의 순서도 재구성해야하기 때문이다.

 

2. 인덱스 구축이 완료될때까지 데이터 베이스의 모든 read/write 작업은 중단된다.

데이터가 먼저 삽입되고 난 후에 foreground로 인덱스를 구축하게 되는 경우 콜렉션에 대량의 데이터가 있다면 인덱스를 생성하는데 몇시간 ~ 몇일까지도 걸릴 수 있다. 이 시간 동안 데이터 베이스의 모든 read/write 작업은 중단된다.

 

아래와 같이 background 옵션을 이용하여 인덱스를 구축하면서 다른작업들도 가능하게한다.

db.collection.createIndex({idx_name: 1}, {background: true})

background에서 인덱스를 구축하면, 다른 읽기/쓰기 요청 시 잠시 구축을 멈춘다.

트래픽이 최소화되는 시간에 인덱스를 구축하면 시간을 줄일 수 있다.

foreground 인덱싱보다는 작업시간이 더 오래 걸린다.

MongoDB 4.2버전에서는 옵션이 Deprecated이므로 확인하고 사용해야한다.

 

반응형

댓글