복붙노트

[MONGODB] 집계 쿼리에 MongoDB의 성능

MONGODB

집계 쿼리에 MongoDB의 성능

MongoDB의 성능에 대해 너무 많은 좋은 일들을들은 후 우리는 MongoDB를 우리가이 문제를 해결하기 위해 시도를 제공하기로 결정했다. 나는 MongoDB를 단일 컬렉션에 여러 MySQL의 데이터베이스에 우리가 가지고있는 모든 레코드를 이동하여 시작했다. 이것은 HD 공간의 약 100 GB의 소요 29 개 백만 문서와 모음 (그들 각자가 적어도 20 개 필드가) 결과. 우리는 모든 문서가 동일한 구조를 갖고 있기 때문에 하나 개의 컬렉션 그들 모두를 넣어하기로 결정하고 우리는 쿼리 및 모든 문서에 대한 집계 결과를 원한다.

나는 다른 연령대에 걸릴 것조차 간단한 수를 () 내 쿼리에 맞게 일부 인덱스를 만들었습니다. 그러나 여전히 너무 오래 걸릴 같은 별개로 () 및 그룹 ()를 쿼리합니다.

예:

// creation of a compound index    
db.collection.ensureIndex({'metadata.system':1, 'metadata.company':1})

// query to get all the combinations companies and systems
db.collection.group({key: { 'metadata.system':true, 'metadata.company':true }, reduce: function(obj,prev) {}, initial: {} });

나는 mongod 로그를 살펴했고 (쿼리 이상을 실행하는 동안)는 이와 같은 라인을 많이 가지고 :

Thu Apr  8 14:40:05 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {}  bytes:1048890 nreturned:417 154ms
Thu Apr  8 14:40:08 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {}  bytes:1050205 nreturned:414 430ms
Thu Apr  8 14:40:18 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {}  bytes:1049748 nreturned:201 130ms
Thu Apr  8 14:40:27 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {}  bytes:1051925 nreturned:221 118ms
Thu Apr  8 14:40:30 getmore database.collection cid:973023491046432059 ntoreturn:0 query: {}  bytes:1053096 nreturned:250 164ms
...
Thu Apr  8 15:04:18 query database.$cmd ntoreturn:1 command  reslen:4130 1475894ms

이 쿼리는 방법으로 더 이상 내가 (결과 목록은 60 항목이) 기대하는 것이 무엇보다 1475894ms했다. 이것은 내 컬렉션에 문서의 많은 수의 주어진 예상 한 우선이된다? 일반적으로 집계 쿼리는 MongoDB를 너무 느린 것으로 예상하고 있습니까? 방법에 대한 어떤 생각 나는 성능을 향상시킬 수 있습니까?

나는 메모리의 듀얼 코어와 10기가바이트과 단일 시스템에서 MongoDB를 실행하고 있습니다.

고맙습니다.

해결법

  1. ==============================

    1.아이디어는 여러 시스템에 분산되어 분산됩니다 데이터베이스에 맵리 듀스를 사용하여 집계 쿼리의 성능을 향상시킬 것입니다.

    아이디어는 여러 시스템에 분산되어 분산됩니다 데이터베이스에 맵리 듀스를 사용하여 집계 쿼리의 성능을 향상시킬 것입니다.

    나는 동일한 시스템에서 오라클에서 그룹별로 선택 문을 몽고의 맵리 듀스의 일부 성능 비교를했다. 나는 몽고 약 25 배 느린 것을 발견했다. 오라클은 단일 시스템에서 제공 나는 적어도 25 기계를 통해 데이터를 샤딩해야한다는이 방법은 몽고와 동일한 성능을 얻을 수 있습니다. 나는 약 1400 만 문서 / 행과 모음 / 테이블을 사용했다.

    몽고를 통해 mongoexport.exe에서 데이터를 내보내기 및 Oracle에서 외부 테이블로 보낸 데이터를 사용하여 오라클에 의해 그룹-A를 수행하는 것은 훨씬 더 빨리 몽고의 자신의 맵리 듀스를 사용하는 것보다했다.

  2. ==============================

    2.커플 것들.

    커플 것들.

    1) 귀하의 그룹 쿼리는 많은 양의 데이터를 처리 중입니다. 당신의 결과 집합이 작은 동안 그 작은 결과를 생성하기 위해 컬렉션의 모든 데이터의 테이블 규모를하고있는 것처럼, 그것은 보인다. 이것은 아마도 속도 저하의 근본적인 원인이다. 이 속도를 높이기 위해, 당신은 가능성이 병목 현상으로 쿼리가 실행되는 동안 iostat를 통해 서버의 디스크 성능을보고 할 수 있습니다.

    2)으로는 다른 답변에서 지적 된 그룹 명령은 한계 성능을 것입니다 자바 스크립트 인터프리터를 사용합니다. 당신은 2.1 베타로 출시되는 새로운 통합 프레임 워크를 사용하여 시도 할 수 있습니다 (참고 :이 2 월 (24) 2012 년과 같은 불안정한 릴리스입니다). 좋은 소개를 위해 http://blog.mongodb.org/post/16015854270/operations-in-the-new-aggregation-framework를 참조하십시오. 이것은 (1)의 데이터 볼륨 문제를 극복하지 않습니다,하지만 C ++로 구현되며, 자바 스크립트 시간이 병목 있다면, 그것은 훨씬 더 빨리해야한다.

    3) 또 다른 방법은 당신의 분류 결과와 두 번째 모음을 생성 감소지도 증분을 사용하는 것입니다. 아이디어는 한 번 결과를 집계하는지도-감소 작업을 실행하고, 기존의 수집에 새로운 데이터를 재 - 줄 것을 주기적으로 다른지도-감소 작업을 실행할 것이다. 그럼 당신은 오히려 그룹 명령을 할 때마다 실행하는 것보다 당신의 응용 프로그램에서이 두 번째 모음을 조회 할 수 있습니다.

  3. ==============================

    3.이 자바 스크립트 VM이 아닌 데이터베이스 엔진에서 수행되기 때문에 집계가 (감소하거나지도) 몽고에 매우 느립니다. 이 시계열 데이터에 대한이 (매우 좋음, IMO)의 DB 제한되고 있습니다.

    이 자바 스크립트 VM이 아닌 데이터베이스 엔진에서 수행되기 때문에 집계가 (감소하거나지도) 몽고에 매우 느립니다. 이 시계열 데이터에 대한이 (매우 좋음, IMO)의 DB 제한되고 있습니다.

  4. from https://stackoverflow.com/questions/2599943/mongodbs-performance-on-aggregation-queries by cc-by-sa and MIT license