2012-04-19 2 views
2

는 무엇 덮인 수집에 역 삽입 순서로 정렬하는 가장 빠른 방법이다하는 것은 '자연'의 사용을 우회 인덱싱 된 ('rf') 필드는 쿼리 속도를 크게 떨어 뜨립니다. 예상 된 동작입니까? 찾기/색인 후에 '자연'정렬을 계산해서는 안됩니까? '자연'일종의없이MongoDB를 색인 및 자연 정렬 최적화

:

db.log.find({ rf : 'o-5556457634'}).explain(); 
{ 
"cursor" : "BtreeCursor rf_1", 
"nscanned" : 4, 
"nscannedObjects" : 4, 
"n" : 4, 
"millis" : 0, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 
    "rf" : [ 
     [ 
      "o-5556457634", 
      "o-5556457634" 
     ] 
    ] 
} 

힌트는 'RF'인덱스를 사용하는 엔진을 강제로 수행하지만 결과는 우회 (역) 종류

db.log.find({ rf : 'o-5556457634'}).sort({ '$natural' : -1 }).hint({rf :1}).explain(); 
{ 
"cursor" : "BtreeCursor rf_1", 
"nscanned" : 4, 
"nscannedObjects" : 4, 
"n" : 4, 
"scanAndOrder" : true, 
"millis" : 0, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"isMultiKey" : false, 
"indexOnly" : false, 
"indexBounds" : { 
    "rf" : [ 
     [ 
      "o-5556457634", 
      "o-5556457634" 
     ] 
    ] 
} 
} 

답변

1

그것을 '자연' sort을 추가 할 때 쿼리 최적화 프로그램이 잘못된 것을 수행하는 것처럼 보입니다.

.hint({rf :1})을 쿼리에 추가하여 어떤 결과가 발생할 수 있습니까?

+0

그냥 힌트 - 설명과 함께 질문을 업데이 트했습니다. 엔진이 'rf'인덱스를 사용하도록 강제하지만 결과가 (역) '자연'정렬을 우회합니다. – user1345178

+0

정렬 전에 이동을 시도 했습니까? –

+0

예, 결과가 동일합니다 (역 자연 정렬은 무시 됨). 이상적으로 나는 '찾기'쿼리가 동적이기 때문에 쿼리를 가능한 간단하고 직관적으로 유지하는 '힌트'를 피하고 싶습니다. '자연적인'정렬로 인덱스 사용을 창 밖으로 던질 것으로 예상되는지 이해하려고 시도합니다. – user1345178

0

같은 문제에 직면했지만 해결책을 찾았습니다. "_id": - 1 필드를 추가하여 필터 찾기에서 언급 한 필드에 인덱스를 생성 한 다음 sort ({ "_ id": - 1})를 사용할 수 있습니다. 도와주세요.