■ MongoDB

[몽고디비] MongoDB Index 노하우를 알아보자!

> db.comments.find( { timestamp: { $gte: 2, $lte: 4 } } ).explain()
{
    "cursor" : "BtreeCursor timestamp_1",
    "n" : 3,
    "nscannedObjects" : 3,
    "nscanned" : 3,
    "scanAndOrder" : false
}

nscanned : 몽고디비가 스캔했던 인덱스 키의 개수를 의미.

nscannedObjects : 최종 도큐먼트를 얻기위해 스캔했던 도큐먼트의 개수를 의미. 또한 리턴된 모든 최소 도큐먼트의 개수를 포함한다.

n : 리턴된 최종 결과 도큐먼트의 개수. 항상 다음과 같은 부등식이 존재한다.
nscanned >= nscannedObjects >= n 이것을 아래와 같은 등식으로 바꾸면 최적의 쿼리가 된다.
nscanned = nscannedObjects = n 일반적으로 범위 $gt, $lt등을 갖고 find해야 할 쿼리에 대해서 해당 필드가 더 뒤에 와야한다.
질의 시 만약 sorting 기능을 활용했다면, scanAndOrder 필드를 살펴봐야한다.
비록 nscanned = nscannedObjects = n 라는 등식을 만족했더라도, scanAndOrder필드가 true라면 다시한번 최적화를 해야한다.
이유는 scanAndOrder필드가 true일땐 모든 도큐먼트를 메모리로 로드해서 다시 정렬했다는 의미가 된다. (CPU와 RAM이 busy 상태가 된다.)

결론은,
1. 중복이 많은 필드
2. 정렬이 필요한 필드
3. 범위로 질의할 필드 순으로 인덱스를 만들면된다. 여기서 중요한점은 a-b의 복합인덱스 일경우 a에 관한 인덱스를 만들필요가 없다. (어차피 a-b에서 a를 포함하여 인덱싱 되어있다.)

Standard

댓글 남기기