2017-09-21 3 views
0
에 agregate 쿼리 속도를하는 방법 나는이 유사 집계 쿼리의 예를 실행하고

:MongoDB를

내가 5,000,000 1000 K- 주위에 (큰 JSON 문서를 삽입 만들어 https://www.compose.com/articles/aggregations-in-mongodb-by-example/

db.mycollection.aggregate([ 
    { 
    { $match: {"nested.field": "1110"}}, { 
    $group: { 
     _id: null, 
     total: { 
     $sum: "$nested.field" 
     }, 
     average_transaction_amount: { 
     $avg: "$nested.field" 
     }, 
     min_transaction_amount: { 
     $min: "$nested.field" 
     }, 
     max_transaction_amount: { 
     $max: "$nested.field" 
     } 
    } 
    } 
]); 

한 수집 > V 쌍, 일부는 중첩 됨).

하나의 중첩 된 필드에 색인을 추가하기 전에 해당 필드의 개수를 계산하는 데 약 5 분이 걸립니다. 인덱스를 추가 한 후 - 계산을 위해 1 초 이내에 완료됩니다.

위의 예와 같이 SUM 또는 AVG 또는 다른 유사한 예를 시도하고 있습니다. 몇 분이 걸리지 만 초 단위는 아닙니다. MongoDB에서 집계 쿼리를 향상시킬 수있는 방법이 있습니까?

감사합니다.

+1

[더 큰 보트 타기] (http://www.urbandictionary.com/define.php?term=We%27re%20Gonna%20Need%20a%20Bigger%20Boat). 최적의 "쿼리"선택이 가능한 작업을 수행하는 동안 많은 양의 데이터를 처리하는 완전한 프로세스에는 상당한 시간이 필요합니다. 쿼리 플래너 이상으로 인덱스에 일치하는 결과의 수를 평가합니다 (특히 메모리에있는 경우). –

+0

Ok .. 비슷한 열을 MySQL (sum)에서 실행하고 5M 레코드에서 몇 초도 걸리지 않습니다. MySQL에서 중첩 된 JSON을 쉽게 수행 할 수 없다는 것을 이해합니다 (또는 적어도 그렇게 빠르지는 않습니다). 그러나 이 경우 Mongo의 성능이 향상 될 것으로 기대하고있었습니다. 아니면 다른 조정이 있습니까? (고객으로부터 무작위로 JSON을 얻고 있기 때문에 나에게 오기 전에 어떻게 보이는지 알지 못한다.하지만 몇 개의 필드를 저장하고 색인해야한다.) – Joe

+0

데이터의 정적 정도에 따라 매번이 쿼리를 실행할 수있다. X를 선택하고 결과를 문서에 삽입하십시오. – Skami

답변

1

불행히도, 그룹은 현재 mongodb에서 색인을 사용하지 않습니다. 정렬 및 일치 만 인덱스를 이용할 수 있습니다. 따라서 작성한 쿼리는 최대한 최적화되었습니다.

할 수있는 몇 가지 작업이 있습니다. 최대 및 최소의 경우 집계 프레임 워크를 사용하는 대신 쿼리 할 수 ​​있습니다. $ nested.field로 정렬하고 하나만 가져올 수 있습니다. $ nested.field에 인덱스를 넣을 수 있으며 같은 인덱스로 오름차순 또는 내림차순으로 정렬 할 수 있습니다.

데이터가 삽입되는 시점을 제어 할 수 있고 조회가 보이는 것처럼 간단하면 데이터를 직접 추적 할 수 있습니다. 따라서 컬렉션에 "ID"가 있거나 그룹화하려는 대상이있는 "mongo"테이블을 가질 수 있으며 "total"및 "sum"필드가있을 수 있습니다. 당신은 삽입물에서 그것들을 증가시킬 수 있고 그 다음 합계와 평균을 얻는 것이 빠른 쿼리 일 것입니다. 그것은 귀하의 상황에 대한 선택의 여지가 있지만, 당신이 할 수있는 최선 있는지.

일반적으로 mongo는 초고속입니다. 제 생각에는 SQL만큼 좋지 않은 유일한 곳은 집계입니다. 그 이득은 나에 대한 투쟁보다 훨씬 중요합니다. 필자는 일반적으로 이러한 유형의 상황에 대해 별도로보고 컬렉션을 유지합니다.

+0

'방법'에 대한 훌륭한 답변을 보내 주셔서 감사합니다. 이러한 권장 사항 중 일부를 시도합니다 .. – Joe