2010-04-08 53 views
27

Sau khi nghe rất nhiều điều tốt đẹp về hiệu suất của MongoDB, chúng tôi quyết định cho Mongodb một nỗ lực để giải quyết một vấn đề mà chúng tôi có. Tôi bắt đầu bằng cách di chuyển tất cả các bản ghi chúng tôi có trong một số cơ sở dữ liệu mysql đến một bộ sưu tập duy nhất trong mongodb. Điều này dẫn đến một bộ sưu tập với 29 triệu tài liệu (mỗi một trong số họ có ít nhất 20 trường) chiếm khoảng 100 GB không gian trong HD. Chúng tôi quyết định đưa tất cả vào một bộ sưu tập vì tất cả các tài liệu đều có cùng cấu trúc và chúng tôi muốn truy vấn và tổng hợp các kết quả trên tất cả các tài liệu đó.Hiệu suất của MongoDB trên truy vấn tổng hợp

Tôi đã tạo một số chỉ mục để phù hợp với truy vấn của mình nếu không, ngay cả một số đếm đơn giản() sẽ mất độ tuổi. Tuy nhiên, các truy vấn như distinct() và group() vẫn mất quá nhiều thời gian.

Ví dụ:

// 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: {} }); 

Tôi đã xem xét các bản ghi mongod và nó có rất nhiều dòng như thế này (trong khi thực hiện các truy vấn trên):

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 

Truy vấn này mất 1475894ms mà là cách dài hơn những gì tôi mong đợi (danh sách kết quả có khoảng 60 mục). Trước hết, liệu điều này có được dự kiến ​​cho số lượng lớn tài liệu trong bộ sưu tập của tôi không? Các truy vấn tổng hợp nói chung có được mong đợi quá chậm trong Mongodb không? Bất kỳ suy nghĩ về làm thế nào tôi có thể cải thiện hiệu suất?

Tôi đang chạy mongod trong một máy tính có lõi kép và bộ nhớ 10GB.

Cảm ơn bạn.

+1

Câu hỏi này quá cũ và vẫn đến với các công cụ tìm kiếm khi bạn tìm kiếm khung công tác tổng hợp MongoDB. Mario bạn đã không đề cập đến phiên bản MongoDB của bạn, vì chúng cải thiện AF rất nhiều trong 2,4 và tôi đang làm nó trên một m1 crappy. EC2 với bộ nhớ 3.7G trên một bộ sưu tập với 69m và nó nhanh hơn so với trước đây. Bạn đã thử phiên bản mới hay bạn đã đi với một cách tiếp cận khác? Chắc chắn có rất nhiều điểm chuẩn cho AF so với MapReduce nhưng hãy xem xét điểm mới nhất từ ​​10Gen http://blog.mongodb.org/post/62900213496/qaing-new-code-with-mms-map-reduce-vs -kết hợp tnx – Maziyar

+0

Cảm ơn nhận xét của bạn. Điều này đã trở lại vào năm 2010, tôi tin rằng chúng tôi đã sử dụng một cái gì đó giống như MongoDB 1.4.0. Đã lâu rồi, tôi chắc chắn có rất nhiều thứ đã thay đổi trong mongodb từ nhưng tôi đã không làm việc trong dự án đó kể từ cuối năm đó :) –

+0

Cảm ơn Mario đã trả lời. Tôi mới bắt đầu sử dụng MongoDB (khoảng một năm) và chỉ tự hỏi xem điều gì đã xảy ra với dự án của bạn. Chúc may mắn :) – Maziyar

Trả lời

22

Ý tưởng là bạn cải thiện hiệu suất của truy vấn tổng hợp bằng cách sử dụng MapReduce trên cơ sở dữ liệu đã phân phối được phân phối trên nhiều máy.

Tôi đã thực hiện một số so sánh về hiệu suất của Mapreduce của Mongo với câu lệnh nhóm theo lựa chọn trong Oracle trên cùng một máy. Tôi đã thấy rằng Mongo chậm hơn khoảng 25 lần. Điều này có nghĩa là tôi phải phân tích dữ liệu trên ít nhất 25 máy để có được hiệu suất tương tự với Mongo khi Oracle phân phối trên một máy tính duy nhất. Tôi đã sử dụng một bộ sưu tập/bảng với khoảng 14 triệu tài liệu/hàng.

Xuất dữ liệu từ mongo qua mongoexport.exe và sử dụng dữ liệu được xuất dưới dạng bảng bên ngoài trong Oracle và thực hiện một nhóm trong Oracle nhanh hơn nhiều so với sử dụng MapReduce của riêng Mongo.

+0

Sẽ rất hữu ích khi biết phiên bản MongoDB nào. – nilskp

+0

Tôi tin rằng nó giống như phiên bản 1.4.0. Điều này đã trở lại vào năm 2010. –

4

Tổng hợp (bản đồ giảm hoặc khác) là rất chậm trong mongo bởi vì nó được thực hiện bởi máy ảo javascript, không phải là công cụ cơ sở dữ liệu. Điều này tiếp tục là một hạn chế của db (rất tốt, imo) này cho dữ liệu chuỗi thời gian.

+1

Từ v2.2, đường ống tổng hợp sử dụng [hoạt động gốc] (http://docs.mongodb.org/manual/core/aggregation-introduction/#aggregation-pipelines). – Tamlyn

8

Vài thứ.

1) Truy vấn nhóm của bạn đang xử lý dữ liệu. Trong khi tập kết quả của bạn nhỏ, có vẻ như nó đang thực hiện quy mô bảng của tất cả dữ liệu trong bộ sưu tập của bạn để tạo ra kết quả nhỏ. Đây có lẽ là nguyên nhân gốc rễ của sự chậm chạp. Để tăng tốc độ này, bạn có thể muốn xem hiệu năng đĩa của máy chủ thông qua iostat trong khi truy vấn đang chạy vì đó có thể là nút cổ chai.

2) Như đã được chỉ ra trong các câu trả lời khác, lệnh nhóm sử dụng trình thông dịch javascript, sẽ giới hạn hiệu suất. Bạn có thể thử sử dụng khung tổng hợp mới được phát hành dưới dạng beta trong phiên bản 2.1 (lưu ý: đây là bản phát hành không ổn định kể từ ngày 24 tháng 2 năm 2012). Xem http://blog.mongodb.org/post/16015854270/operations-in-the-new-aggregation-framework để có phần giới thiệu tốt.Điều này sẽ không khắc phục vấn đề khối lượng dữ liệu trong (1), nhưng nó được thực hiện trong C + + và nếu javascript thời gian là nút cổ chai, sau đó nó sẽ được nhanh hơn nhiều.

3) Một cách tiếp cận khác là sử dụng bản đồ gia tăng-giảm để tạo bộ sưu tập thứ hai với kết quả được nhóm của bạn. Ý tưởng là bạn sẽ chạy công việc giảm bản đồ để tổng hợp kết quả của bạn một lần và sau đó chạy theo định kỳ một công việc giảm bản đồ khác để làm giảm lại dữ liệu mới vào bộ sưu tập hiện có. Sau đó, bạn có thể truy vấn bộ sưu tập thứ hai này từ ứng dụng của mình thay vì chạy một lệnh nhóm mỗi lần.

Các vấn đề liên quan