RDB와 마찬가지로 인덱싱을 하지 않으면 컬렉션스캔(풀스캔)이 일어나 성능이 저하된다. explain() 함수를 통해 해당 쿼리를 실행하면서 살펴본 도큐먼트 개수를 확인할 수 있으니, 실제로 인덱싱의 성능 차이를 확인할 수 있다.
db.users.createIndex({”username”: 1})
두 개 이상의 필드로 구성된 인덱스
쿼리에서 여러 기준으로 정렬시에 인덱싱된 필드가 뒷 순서라면 인덱싱의 효과가 없다. 정렬 기준이 여러개라면 복합 인덱스로 구성하자.
db.users.createIndex({”age”: 1, "username":1 })
의 인덱스 구성예시
몽고 디비에서 쿼리 성격당 인덱스를 사용하는 방법
db.users.find("age": 21).sort({"username": -1})
⇒ 효과 좋음db.users.find({"age" : {"$gte" :** 21, **$lte" :** **30}})
⇒ 효과 좋음db.users.find({"age" : {"$gte" :** 21, **$lte" :** **30}}).sort({"username": 1})
⇒인덱싱된 age로 범위 쿼리를 진행하는 것은 효과가 좋으나 username을 역순으로 정렬하는 것에서 성능 저하가 있을 수 있음 -> 원래 익덱스 도큐먼트에는 오름차순(-1)으로 정렬되어있음
쿼리가 들어오면 몽고DB는 쿼리모양을 확인한다. (검색할 필드와 정렬여부 등)
시스템은 이 정보를 기반으로 쿼리를 충족하는데 사용할 인덱스 후보 집할을 식별한다.
몽고디비는 각 인덱스 후보에 하나씩 쿼리 플랜을 만들고 각각 다른 인덱스를 사용하는 n개의 병렬스레드에서 쿼리를 실행한다.
어떤 인덱스를 사용하는 스레드가 가장 빨리 결과를 반환하는지 확인한 후에 앞으로 동일한 모양을 가진 쿼리에 사용할 인덱스로 선택한다.
플랜은 시범기간동안 서로 경쟁하며, 각 레이스의 결과로 전체 승리 플랜을 산출한다.