2015-02-06 3 views
24

수백만 행의 mongoDB 컬렉션이 있는데 쿼리를 최적화하려고합니다. 현재 데이터를 검색하고 원하는대로 그룹화하기 위해 집계 프레임 워크를 사용하고 있습니다. 내 일반적인 집계 쿼리는 다음과 같습니다 : $match > $group > $ group > $project

그러나 마지막 부분은 몇 ms 밖에 걸리지 않는 것으로 나타났습니다. 시작 부분이 가장 느립니다.

$ match 필터 만 사용하여 쿼리를 수행 한 다음 collection.find를 사용하여 동일한 쿼리를 수행하려고했습니다. 집계 쿼리는 ~ 80ms가 걸리는 반면에, 찾기 쿼리는 0 또는 1ms가 걸립니다.

나는 각 필드에 꽤 많은 인덱스가 있으므로 문제는 아닌 것으로 생각됩니다. 무엇이 잘못 될 수 있는지에 대한 아이디어가 있습니까? 아니면 집합 프레임 워크의 "일반적인"단점입니까?

집계 쿼리 대신 find 쿼리를 사용할 수 있지만 요청 후 많은 처리를 수행해야하며이 프로세스는 $group 등으로 신속하게 수행 할 수 있으므로 집계 프레임 워크를 유지하려고합니다.

감사합니다,

편집 :

여기

이 내 기준 :

{ 
    "action" : "click", 
    "timestamp" : { 
      "$gt" : ISODate("2015-01-01T00:00:00Z"), 
      "$lt" : ISODate("2015-02-011T00:00:00Z") 
    }, 
    "itemId" : "5" 
} 
+0

'$ match'를 게시하고 찾을 수 있습니까?대부분의 사용법에서'$ match'와 find는 똑같아 야하지만 정확한 답을 내기 위해 정확히 어떤 문장을 비교하는지 알고 싶습니다. 또한 집계를 먼저 실행 한 다음 찾기를 실행 했습니까? 두 번 반복해서 반복하고 시간을 비교하면 어떻게됩니까? 차이점은 결과를 디스크에서 메모리로 옮기는 비용이었습니다. – wdberkeley

+0

첫 번째 게시물에 기준을 추가했지만 타임 스탬프 기준이 없어도 큰 차이가 있음을 알 수 있습니다. 그러나 이제 find()가 커서를 반환하고 첫 번째 결과 만 표시한다는 사실과 관련이 없는지 궁금합니다. – Owumaro

+7

좋아요, 쓸모없는 인덱스가 많아서 모든 것을 정리하고 하나의 복합 인덱스 (내 $ match 필터 필드 포함)를 만들었습니다. 이제 나는 $ match와 함께 좋은 성능과 동일한 퍼포먼스를 찾아 내고 집계합니다 :) 문제는 해결되었습니다. – Owumaro

답변

14

aggregation framework의 주요 목적은 항목의 큰 수의 쿼리를 완화하고 낮은 번호를 생성하는 것입니다 귀하에게 가치있는 결과를 제공합니다.

앞서 말씀 드린대로 find 검색어를 여러 개 사용할 수도 있지만 find 개의 검색어로 새 입력란을 만들 수는 없습니다. 반면에 $group 단계에서는 새 필드를 정의 할 수 있습니다.

aggregation framework의 기능을 구현하려면 대부분 find (또는 여러 개의 체인을 연결해야 함) 정보를 가져 와서 프로그래밍 언어로 조작해야합니다.

aggregation pipeline은 시간이 오래 걸릴 수도 있지만 적어도 하나의 시스템 (MongoDB 엔진)의 성능 만 고려하면됩니다.

find 쿼리에서 반환 된 데이터를 조작 할 때는 프로그래밍 언어로 데이터를 조작해야 할 가능성이 높으므로 선택한 프로그래밍 언어의 복잡성에 따라 복잡성이 증가합니다.

+9

감사합니다. 그러나 여전히 $ match 필터 만 사용하는 집계 쿼리가 동일한 필터를 사용하는 간단한 쿼리를 찾는 것과 같은 속도가 아니라는 것을 이해하지 못합니다. – Owumaro

3

당신은 당신의 찾기 쿼리에 대해 explain()을 사용해 보았습니까? find()가 정확히 걸릴 시간에 대한 좋은 아이디어를 줄 것입니다. 달러 설명 &으로 $ match에 대해 동일한 작업을 수행 할 수 있습니다. & 다른 매개 변수에 액세스하는 색인에 차이가 있는지 확인하십시오.

또한 집계 프레임 워크의 $ group 부분은 인덱싱을 사용하지 않으므로 집계 프레임 워크의 $ match 단계에서 반환 된 모든 레코드를 처리해야합니다. 따라서 쿼리 결과를보다 잘 이해하기 위해서는 결과 집합을보고 &을 MongoDB가 처리 할 메모리에 맞출 지 여부를 반환합니다.