(MongoDB) Compound Index 설계하기

세가지 케이스가 존재

1.  db.students.createIndex({student_id: 1, class_id: 1})


db.students.find({student_id:{$gt:500000}, class_id:54})
    .sort({student_id:1})
    .explain("executionStats")

위 인덱스를 태워 쿼리를 조회 할 떄와


db.students.createIndex({class_id:1, student_id:1})

이 인덱스와 성능을 비교하면

참고로 class_id의 분류 갯수는 800 여개
아래 인덱스를 탈 때 더 좋은 성능을 보여준다.

즉, 먼저 필터역할을 하여 스캔해야할 document를 줄인다.

만약 
db.students.find({student_id:{$gt:500000}, class_id:54})
    .sort({final_grade:1})
    .explain("executionStats")

final_grade로 정렬할 필요가 있다면,
현재 인덱스로 쿼리를 타게되면
몽고디비 메모리 상에서 위 인덱스를 sort하게 되어 더 나쁜 현상을 보인다.

즉, 
db.students.createIndex({class_id:1, final_grade:1, student_id:1})
이 인덱스로 해당 쿼리를 조회해주면 된다.

결과적으로

compoundedIndex는
  • Keys for equality filters should appear first.
  • Keys used for sorting should appear before multi-value fields.
  • Keys for multi-value filters should appear last.
다음과같이 디자인하는것이좋다.

댓글

이 블로그의 인기 게시물

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

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

(ElasticSearch) 결과에서 순서 정렬