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

[MongoDB] Single Field Indexes, Compound Index (단일 인덱스, 복합 인덱스)

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

[MongoDB] Single Field Indexes(단일 인덱스), Compound Index(복합 인덱스)

 

Single Field Indexes (단일 인덱스)

 

쿼리에서 단 하나의 key만을 이용한다면 단일 키 인덱스를 사용해야 한다.

db.records.createIndex( { score: 1 } )

records 필드를 키로 인덱스를 만든다. 여기서 1은 오름차순, -1은 내림차순을 의미한다.

 

score생성된 인덱스는 다음과 같이 필드에서 선택하는 쿼리를 지원한다 .

db.records.find( { score: 2 } )
db.records.find( { score: { $gt: 10 } } )

 

생성한 인덱스를 확인하기 위해서 아래와 같이 조회 할 수 있다.

db.records.getIndexes() 
db.records.totalIndexSize()

records 인덱스 확인을 할때는 db.records.getIndexes()을 사용한다.
records 인덱스 사이즈를 확인할때는 db.records.totalIndexSize()을 사용한다.

 

records 별로 오름차순이 되어 있기 때문에 색인 처럼 빠르게 원하는 카테고리를 찾아 낼 수 있다.

정렬이 되어 있기 때문에 범위로 검색하는 것도 수월하다.

Single Field Indexes 사진
Single Field Indexes사진

일렬로 나열되어 있기 때문에 찾는 순서는 중요하지 않다.

왼쪽에서 오른쪽으로 읽든, 오른쪽에서 왼쪽으로 읽든 어차피 동일하기 때문이다.

즉, 단일 인덱스에서 오름차순으로 정의 된 인덱스의 컬렉션을 내림차순으로 검색해도 동일한 성능을 낸다.

 

 

 

Compound Index (복합 인덱스)

 

복합 인덱스(Compund Index)는 검색어에 여러 키가 사용된다면 이 인덱스 타입으로 정의해야 한다.

db.students.createIndex({ userid: 1, score: -1 })

컴파운드 인덱스가 여러 키를 지정 할 수 있다고 해서 각각 다른 쿼리에 각각의 키로 검색 할 수 있다고 생각하면 안된다.
컴파운드 인덱스를 제대로 이해하기 위해서는 이 부분을 주의 깊게 살피고 이해해야 한다.

위의 쿼리에서 학생 컬렉션의 인덱스로 userid와 score가 별개의 데이터 구조를 가지고 있는 것은 아니다.

마치 단일 인덱스처럼 일렬로 나열 된 userid 배열에서 각 아이템에 score를 담고 있는 것으로 생각 할 수 있다.

 

Compound Index 사진
Compound Index 사진

위 그림에서처럼 두 인덱스가 함께 저장되어 있으며, 첫번째 userid는 원하는 대로 오름차순의 순서대로 예쁘게 정렬되어 있지만 score는 그렇지 않다.
동일한 userid들끼리는 그 안에서 score가 내림차순으로 다시 정렬되어 있다.


score는 동일한 userid 안에서만 정렬이 되어 있으므로 단독으로 검색을 할 때에는 효율이 좋지않다.

그런 경우에는 score를 위한 인덱스를 따로 만들어주는 것이 성능에 이점이 있다.

 

* 컴파운드 인덱스의 핵심

1. 컴파운드 인덱스로 지정한 각각의 필드는 그 순서대로 쿼리문에 나타나야 한다.

2. userid 만을 이용해서 검색하는 것은 옳은 방법이고 userid와 함께 score를 조합해서 검색하는 것도 옳은 방법이다.

3. 하지만 score만 단독으로 검색하는 것은 옳지 않은 방법이다.

 

* 결론

1. 데이터베이스에서 인덱스의 선택도를 높이는 방법은 간단하다.

2. 두 개 이상의 컬럼을 조합해서 인덱스를 걸어주면, 조합된 인덱스 키의 카디널리티가 증가하고 결국 선택도도 증가하여 효율이 좋은 인덱스가 된다.

3. 대신 인덱스 키를 많이 사용하여 공간 효율이 낮아지게 된다.

4. 잘선택해서 상황에 맞게 사용하자.

반응형

댓글