2014-07-07 6 views
0
db.collection.aggregate(

{ "$match" : { 
     "key" : "mykey" 

    } 
}, 
{ 
    "$sort" : { 
     "time" : -1 
    } 
}, 
{ 
    "$limit" : 1 
} 

는)MongoDB를 집계 매우 느린

예를 들어 문서 :

{ 
    key: "key1", 
    time: ISODate("2014-07-04T20:04:46.904Z") 
} 

인덱스는

"time" : -1 
"key" : 1, 
"_id" : 1 

는 "의 mykey는"존재하는 경우 "mykey"가 존재하지 않으면 10 초가 걸리는 콜렉션에서 쿼리는 30ms가 걸리며, 은 인덱스가 있음을 알려줍니다. 사용되었습니다. 이것은 capped 컬렉션입니다. 따라서 일반적으로 "키"가 누락되었습니다. 왜 그렇게 오래 걸립니까. btw. MongoDB를 2.4

더 탐험 : 인덱스 정렬이 시작에서 실행됩니다 보여줍니다

와 정렬 필드에 인덱스가없는 집합에 대한 설명 : 정렬에 대한 인덱스를 제거는

조회 시간을 단축 파이프 라인의 정렬 인덱스없이이 파이프 라인

+0

질문이 있으십니까? –

+0

키가 없는데 왜 오래 걸릴까요? – user192576

+0

"존재"는 무엇을 의미합니까? 해당 키에 해당 값이 있는지 또는 필드가 스키마에 있는지 여부 –

답변

0

귀하의 쿼리의 마지막 단계로 실행됩니다은 (색인은 본질적으로 time:1, key:1에이에 대한 잘못된 인덱스를 사용하는 것을 의미 key에 평등과 종류에 time입니다).

실행중인 쿼리의 필드 순서는 key:1, time:1 (처음 두 개의 필드로)이어야 유효합니다. 이 인덱스를 사용하면 일치 된 key 값을 직접 이동할 수 있으며 key에 대해 time 값이 여러 개 있으면 정렬되고 가장 높은 값을 즉시 가져올 수 있습니다. 인덱스에 key이 없으면 작업이 완료된 것입니다.

그렇듯이 쿼리는 첫 번째 일치하는 키를 찾으면 반환 할 수 있도록 인덱스 (앞 필드)의 모든 시간 값을 검색해야합니다. 찾으려는 키가 존재하지 않으면 쿼리가 반환되기 전에 전체 인덱스를 검색합니다.

+0

그래서 기본적으로 1 개의 멀티 키 인덱스를 사용해야합니다. 모든 멀티 매치 인덱스와 정렬 매개 변수가 올바른 순서로 있습니다. 이 필드에 별도의 인덱스를 사용하고있었습니다. 그러나 멀티 키가 이상하게 생각했습니다. – user192576

+0

"멀티 키"인덱스는 배열의 인덱스입니다. 당신은 이미 사용하고있는 "합성물"색인을 사용하기를 원할 것입니다, 당신은 단지 잘못된 순서로 그것을 가지고 있습니다. –