2012-02-20 28 views
9

Tôi có một truy vấn mất quá nhiều thời gian để hoàn tất. Tôi thích làm một số kiểm tra hiệu suất nhưng sau khi tôi kiểm tra một lần (mất khoảng 30 giây) truy vấn bắt đầu chạy nhanh hơn rất nhiều (< 1 giây). Tôi cho rằng nó phải có bộ nhớ đệm mongodb. Có cách nào để vô hiệu hóa bộ nhớ đệm cho mongodb hay cách khác tôi có thể kiểm tra hiệu suất?Làm cách nào để kiểm tra hiệu suất truy vấn mongodb mà không cần bộ nhớ cache

Tôi đang sử dụng mongodb được lưu trữ trong mongohq. Chương trình với Ruby on Rails 3. Dưới đây là giải thích:

{"cursor"=>"BtreeCursor start_-1", "nscanned"=>5276, "nscannedObjects"=>5276, "n"=>25, "millis"=>3264, "nYields"=>0, "nChunkSkips"=>0, "isMultiKey"=>false, "indexOnly"=>false, "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}, "allPlans"=>[{"cursor"=>"BtreeCursor attendees_count_-1", "indexBounds"=>{"attendees_count"=>[[1.7976931348623157e+308, 1]]}}, {"cursor"=>"BtreeCursor images_count_-1", "indexBounds"=>{"images_count"=>[[1.7976931348623157e+308, 2]]}}, {"cursor"=>"BtreeCursor start_-1", "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}}, {"cursor"=>"BtreeCursor start_-1_end_-1", "indexBounds"=>{"start"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]], "end"=>[[{"$maxElement"=>1}, {"$minElement"=>1}]]}}, {"cursor"=>"BtreeCursor attendees._id_1 multi", "indexBounds"=>{"attendees._id"=>[[BSON::ObjectId('4f0b621e94bb688563000007'),BSON::ObjectId('4f0b621e94bb688563000007')], [BSON::ObjectId('4f0b647d5a8c00acde05236f'), BSON::ObjectId('4f0b647d5a8c00acde05236f')], [BSON::ObjectId('4f0b647d5a8c00acde052370'), BSON::ObjectId('4f0b647d5a8c00acde052370')], [BSON::ObjectId('4f0b647d5a8c00acde052371'), BSON::ObjectId('4f0b647d5a8c00acde052371')], [BSON::ObjectId('4f0b647d5a8c00acde052372'), BSON::ObjectId('4f0b647d5a8c00acde052372')], [BSON::ObjectId('4f0b647d5a8c00acde052373') ... (lots of Object IDs)]]}}} 

Chú ý rằng tôi phải cắt bớt một số các giải thích bởi vì nó quá dài. Ở đâu có "nhiều ID đối tượng" có rất nhiều ID đối tượng (~ 400).

Cảm ơn tất cả

Trả lời

2

Khi bạn lần đầu tiên được chạy truy vấn, tập dữ liệu là bộ nhớ ánh xạ, nhưng chưa được paged vào bộ nhớ thực tế, xem Caching trên trang web MongoDB. Vì vậy, hệ điều hành phải trang dữ liệu được đặt vào bộ nhớ và sau đó bạn nhận được truy vấn của bạn chạy và kết quả.

Vì bạn phân trang từ đĩa (chậm) vào RAM (nhanh) chạy ban đầu chậm, và sau đó, trừ khi bạn có áp lực bộ nhớ, dữ liệu đó sẽ nằm trong RAM và tất cả các truy vấn tiếp theo của bạn trên dữ liệu đó thiết lập sẽ được nhanh chóng. Đây là cách MongoDB được thiết kế để hoạt động, quá trình tải dữ liệu của bạn được đặt vào bộ nhớ thường được gọi là "khởi động" cơ sở dữ liệu và chỉ sau khi khởi động (trong trường hợp của bạn truy vấn đầu tiên) mà bạn nhận được hiệu suất thực sự.

Cần lưu ý rằng truy vấn ban đầu của bạn vẫn có vẻ mất nhiều thời gian để trả lại. Bạn nên chắc chắn rằng nó đang sử dụng các chỉ mục một cách hiệu quả. Nơi tốt nhất để bắt đầu điều tra đó là trang explain().

+0

Tôi vẫn muốn truy vấn ban đầu của mình chạy nhanh hơn vì tôi không thể tải tất cả tài liệu vào bộ nhớ. Vì vậy, tôi đã sử dụng giải thích, và thấy rằng nó quét ~ 5000 tài liệu để lấy truy vấn và tôi nghĩ rằng 30 giây là quá nhiều cho 5000 tài liệu. Đó là lý do tại sao tôi muốn tiếp tục làm cùng một truy vấn mà không cần bộ nhớ cache vì vậy tôi không thể kiểm tra những gì là sai. – Gluz

+0

Truy vấn có sử dụng chỉ mục không? Vui lòng thêm giải thích cho câu hỏi và tôi có thể xem kết quả. –

+0

Đã thêm vào tin nhắn gốc. – Gluz

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