2012-08-22 3 views
3

질문 : (타임 스탬프) 나는 5 개 항목 지난 싶어MongoDB : 여러 키를 기준으로 정렬 할 때 인덱스가 사용되지 않는 이유는 무엇입니까?

> db.events.ensureIndex({'ts': -1}) 

: 나는 필드 ts에 의해 색인되어 매우 큰 컬렉션이 있습니다.

> db.events.find().sort({'ts': -1}).limit(5) 
> db.events.find().sort({'_id': -1}).limit(5) 

인가 : 무엇 나를 놀라게하는 쿼리가 인덱스를 사용하지 않는다는 것입니다 매우 느린 따라서이다 : 예상대로

> db.events.find().sort({'ts': -1, '_id': -1}).limit(5) 

그러나, 단지 ts 또는 다른 필드에 의해 정렬이 인덱스를 사용 이것은 MongoDB의 버그입니다. 이건 실제로 문서화 된 기능입니까, 아니면 제가 잘못하고있는 것입니까?

추가 정보 :

> db.events.find().sort({'ts': -1, '_id': -1}).limit(5).explain() 
{ 
    "cursor" : "BasicCursor", 
    "nscanned" : 795609, 
    "nscannedObjects" : 795609, 
    "n" : 5, 
    "scanAndOrder" : true, 
    "millis" : 22866, 
    "nYields" : 73, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 

    } 
} 
> db.events.find().sort({'ts': -1}).limit(5).explain() 
{ 
    "cursor" : "BtreeCursor ts_-1", 
    "nscanned" : 5, 
    "nscannedObjects" : 5, 
    "n" : 5, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
      "ts" : [ 
        [ 
          { 
            "$maxElement" : 1 
          }, 
          { 
            "$minElement" : 1 
          } 
        ] 
      ] 
    } 
} 

답변

5

그것은 인덱싱 조언 & 자주 묻는 질문 위키 페이지의 Indexing Strategies 섹션의 읽기를 가진 가치가있다.

당신이 누락 될 수있는 몇 가지 고려 사항이 있습니다

  • MongoDB를 만 쿼리 당 하나의 인덱스를 사용

  • 인덱스

의 마지막 열이어야 사용 sort

예를 들어, ts_id에 복합 색인을 추가해야합니다 :

db.events.ensureIndex ({ 'ts': - 1, '_id': - 1});

.. 및 정렬 이제 예상 인덱스를 사용하고 있음을 explain()로 확인 :

> db.events.find().sort({'ts': -1, '_id':-1}).limit(5).explain() 
{ 
    "cursor" : "BtreeCursor ts_-1__id_-1", 
    "nscanned" : 5, 
    "nscannedObjects" : 5, 
    "n" : 5, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "ts" : [ 
      [ 
       { 
        "$maxElement" : 1 
       }, 
       { 
        "$minElement" : 1 
       } 
      ] 
     ], 
     "_id" : [ 
      [ 
       { 
        "$maxElement" : 1 
       }, 
       { 
        "$minElement" : 1 
       } 
      ] 
     ] 
    } 
} 
+0

을이 참 답변입니다 - 내가 관계형 DB를 추측 나를 버릇이 ... :) 감사합니다! – johndodo

+0

정렬 열이 인덱스의 마지막 열이어야하는 이유는 무엇입니까? –