(MongoDB) 복합인덱스 사용시 중요한점

다음가 같은 예가 있다.

인덱스는
db.collection("users").ensureIndex({"age" : 1, "username" : 1})
db.collection("users").ensureIndex({"username" : 1, "age" : 1})
두개가 있다.

다음 두 조건으로 검색한다고 하면,

1 .
db.collections("users").find({"age" : {"$gte" : 21, "$lte" : 30}})
 .sort({"usernmae" : 1})
 .limit(1000)
.hint({"age": 1, "username" : 1})
.explain()



2.
db.collections("users").find({"age" : {"$gte" : 21, "$lte" : 30}})
 .sort({"usernmae" : 1})
 .limit(1000)
.hint({"username": 1, "age" : 1})
.explain()



- > 어느것이 더 성능이 좋을까?
2 번이 더 성능이 좋다?
인덱스는 앞의 키부터 타기 때문에 1번이 좋다고 생각 할 수 있지만,
인덱의 정렬순서는 왼쪽 최말단이 가장 작은 값이,  오른쪽 최말단 리프에 가장 큰 값이 들어가는 트리구조다
기본적으로 시간에 따라 탐색하기 때문이다.
즉,
{"정렬키" : 1, "쿼리 검색 조건" : 1} 형태의 인덱스 조건이 애플리케이션에서 대체로 잘 동작한다.

따라서 오래된 데이터보다 최신의 데이터를 사용하는 경향이 있는 애플리케이션을 위해서 몽고디비는 전체가 아닌 단지 트리의 오른쪽 최말단(가장최신) 브랜치들만 메모리에 보관해야 한다.
이와 같은 인덱스를 우편향 인덱스라 하고 "_id"인덱스가 대표적이다.

댓글

이 블로그의 인기 게시물

(ElasticSearch) 결과에서 순서 정렬

(네트워크)폴링방식 vs 롱 폴링방식

(18장) WebSocekt과 STOMP를 사용하여 메시징하기