수백만 행의 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"
}
'$ match'를 게시하고 찾을 수 있습니까?대부분의 사용법에서'$ match'와 find는 똑같아 야하지만 정확한 답을 내기 위해 정확히 어떤 문장을 비교하는지 알고 싶습니다. 또한 집계를 먼저 실행 한 다음 찾기를 실행 했습니까? 두 번 반복해서 반복하고 시간을 비교하면 어떻게됩니까? 차이점은 결과를 디스크에서 메모리로 옮기는 비용이었습니다. – wdberkeley
첫 번째 게시물에 기준을 추가했지만 타임 스탬프 기준이 없어도 큰 차이가 있음을 알 수 있습니다. 그러나 이제 find()가 커서를 반환하고 첫 번째 결과 만 표시한다는 사실과 관련이 없는지 궁금합니다. – Owumaro
좋아요, 쓸모없는 인덱스가 많아서 모든 것을 정리하고 하나의 복합 인덱스 (내 $ match 필터 필드 포함)를 만들었습니다. 이제 나는 $ match와 함께 좋은 성능과 동일한 퍼포먼스를 찾아 내고 집계합니다 :) 문제는 해결되었습니다. – Owumaro