2014-08-30 14 views
4

저는 mongodb 인덱스에 대해 배우고 있으며 질문을하고 싶습니다. mongodb 인덱스에 대한 문서를 읽었습니다. 그러나 나는 어떤 일을 저 지르지 않습니다. 색인 가격 (-1)을 만들었습니다. 정렬 가격 (1)을 사용하는 경우. 이 정렬은 색인을 사용합니까?mongodb 내림차순 오름차순 인덱스

답변

1

대답은 '예'입니다.

rs0:PRIMARY> db.bill.save({price: 100}) 
rs0:PRIMARY> db.bill.save({price: 110}) 
rs0:PRIMARY> db.bill.save({price: 120}) 
rs0:PRIMARY> db.bill.save({price: 130}) 
rs0:PRIMARY> db.bill.save({price: 140}) 
rs0:PRIMARY> db.bill.save({price: 150}) 
rs0:PRIMARY> db.bill.encureIndex({price:-1}) 
rs0:PRIMARY> db.bill.find().sort({price:1}).explain() 
{ 
"cursor" : "BtreeCursor price_-1 reverse", 
"isMultiKey" : false, 
"n" : 6, 
"nscannedObjects" : 6, 
"nscanned" : 6, 
"nscannedObjectsAllPlans" : 6, 
"nscannedAllPlans" : 6, 
"scanAndOrder" : false, 
"indexOnly" : false, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"millis" : 18, 
"indexBounds" : { 
    "price" : [ 
     [ 
      { 
       "$minElement" : 1 
      }, 
      { 
       "$maxElement" : 1 
      } 
     ] 
    ] 
}, 
"server" : "localhost:27017" 
} 
rs0:PRIMARY> db.bill.find().sort({price:-1}).explain() 
{ 
"cursor" : "BtreeCursor price_-1", 
"isMultiKey" : false, 
"n" : 6, 
"nscannedObjects" : 6, 
"nscanned" : 6, 
"nscannedObjectsAllPlans" : 6, 
"nscannedAllPlans" : 6, 
"scanAndOrder" : false, 
"indexOnly" : false, 
"nYields" : 0, 
"nChunkSkips" : 0, 
"millis" : 0, 
"indexBounds" : { 
    "price" : [ 
     [ 
      { 
       "$maxElement" : 1 
      }, 
      { 
       "$minElement" : 1 
      } 
     ] 
    ] 
}, 
"server" : "localhost:27017" 
} 

참고 커서는 "BtreeCursor price_-1 역"및 "BtreeCursor의 price_-1". Mongodb는 "역 색인"을 자동으로 사용합니다.

0

처음으로 인덱스를 연구 할 때 우선적으로 좋은 질문입니다. 질문에 대답하려면 기본적으로 개발자가 쿼리 성능을 향상시키는 인덱스를 사용해야합니다. 귀하의 경우, 성능 저하를 초래하는 색인을 사용 하여서는 안됩니다. 인덱스를 적용하고 필요에 따라 인덱스를 적용하기 전에 쿼리 패턴을 파악하십시오.

경험적 MongoDB에는 쿼리 최적화 프로그램 인 inbuilt도 있습니다. 이제 어떻게 작동 하는가는 쿼리 계획을 테스트하기 위해 여러 가지를 동시에 시도하고 가장 빨리 완료되는 계획을 기록하는 것입니다. 데이터가 변경되는 등 계획 성능이 초과로 변경되면 DB가 다시 최적화됩니다 (즉, 가능한 모든 계획을 다시 시도).

직접 쿼리를 최적화 할 수도 있습니다. 쿼리 계획이 사용 테스트하려면 인덱스가 커서 유형 BtreeCursor을 사용 ---

{ 
    "cursor": "BtreeCursor x_1", 
    ... 
    "nscanned": 100 
    .... 

} 

쿼리 계획

db.collection.find({}).sort({price:1}).explain() 

결과와 같은 쿼리 후()을 설명 할 수 있습니다. 쿼리 계획에서 인덱스를 사용하지 않으면 커서 유형이 BasicCursor입니다.

링크 : http://docs.mongodb.org/manual/core/query-optimization/

+0

쿼리 플래너가 역순으로 인덱스를 걸을 필요가 없으며 기존 인덱스 스펙이나 이름 만 힌트 할 수 있습니다. '{price : 1}'에 대한 색인 만있는 경우'{price : -1}'에 대한 힌트가 실패하여 "잘못된 힌트"예외가 발생합니다. 일반적으로'hint()'*를 사용하는 것이 좋습니다. 특정 색인을 강요하면 성능이 저하 될 수 있습니다. 예상 된 인덱스가 주어진 쿼리 모양에 사용되지 않는 이유를 이해하는 것이 좋습니다. – Stennie

6

예. MongoDB은 두 방향 모두에서 색인을 검색 할 수 있으므로 색인의 순서는 중요하지 않습니다. 여러 필드가있는 복합 색인이있는 경우에만 문제가됩니다. 첫 번째 필드가 있지만 다음 필드는 사용자가 지정한 순서에 따라 고정됩니다.

그럼에도 불구하고 MongoDB는 어느 방향 으로든 색인을 탐색 할 수 있습니다. 따라서 단일 필드 인덱스의 경우 오름차순 및 내림차순 인덱스를 서로 바꿀 수 있습니다. 복합 인덱스의 경우에는 해당되지 않습니다. 복합 인덱스에서 정렬 순서의 방향이 결과에 더 큰 영향을 줄 수 있습니다.

MongoDB documentation.

관련 문제