티스토리 뷰

서로 다른 인덱스가 둘 다 사용 가능할 경우 mongoDB는 어떤 Plan을 선택할까?

 

상황을 가정해보자.

먼저 다음과 같은 2개의 documents가 있고

 

name이라는 single field Index가 있고

name과 age의 combination field Index가 있다.

 

이름이 "Manu"고 나이가 30인 사람을 찾는다고 하면

db.customers.find({name: "Manu", age:30});

 

name에 대한 인덱스도 사용가능하고 name_age에 대한 인덱스도 사용 가능하다.

 

이와 같은 상황에서 mongoDB는 어떤 인덱스를 선택할까?

 

db.customers.explain("allPlansExecution"). find({name:"Manu", age:29})를 실행하면

 

"winningPlan"과 "rejectedPlans"를 보여준다.

 

mongoDB에게 간택받은 전략은

compound index다.

name하나보다 name_age가 더 정확하니까 예상한 결과다.

 

거절당한 Plans를 보면

 

name인덱스를 사용한 plan이 거절당한 것을 알 수 있다.

 

mongoDB는 이 Winning Plan을 cache에 저장한다.

저장하는 이유를 간단히 설명하자면

어떤 쿼리가 실행되었을 때 mongoDB는 위와 같이 어떤 전략을 선택할지 내부적으로 실험을 한다.

그리고 같은 쿼리에 대해서 매번 그 실험을 하는 것은 불필요하다고 판단하기 때문이다.

 

db.collection.getPlanCache(). getPlansByQuery(<query> , <projection><sort>

명령어를 통해서 알 수가 있는 어떤 쿼리에 Cache를 한 plan을 알수가 있다.

 

어떤 전략과 solution과 reason이 나와있다.

 

물론 이 cache에 저장된 plan은 영원하지 않다.

1. 많은 양의 write operation이 실행되었을 경우,

2. index가 다시 만들어졌을 경우

3. 다른 인덱스가 추가되었거나 삭제되었을 경우

4. MongoDB가 재시작되었을 경우

이 cache한 plans들은 사라진다.

 

임의로 없앨수도 있다.(레퍼런스 참조)

 

공식 레퍼런스: https://docs.mongodb.com/manual/core/query-optimization/

'MongoDB > Index' 카테고리의 다른 글

covered query  (0) 2020.02.28
Unique Index and Missing Field  (0) 2020.02.28
TTL Index  (0) 2020.02.27
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함