2012-04-13 29 views
10

Trong MongoDB, bạn có thể nhận được một lời giải thích cho cách một truy vấn được thực hiện, với thông tin hiệu suất hấp dẫn:Làm thế nào để có được một giải thích cho một số MongoDB?

> db.people.find({ 'items' : { '$gte' : 1 } }).explain() 

Tôi có thể nhận được cùng một "đếm" (mà không phải là một truy vấn, nhưng một lệnh) ?

> db.people.count({ 'items' : { '$gte' : 1 } }) 

Trả lời

3

Tôi khá chắc rằng đếm (truy vấn) là viết tắt của tìm (truy vấn) .count() - nói cách khác, giải thích hoàn toàn giống nhau. Không có tính năng tối ưu hóa số cụ thể được thực hiện, ngoại trừ có thể là số lượng bộ sưu tập đầy đủ. Ví dụ, chạy một số đếm trên một trường không được lập chỉ mục cho một phạm vi sẽ chính xác cùng một khoảng thời gian khi chạy một hàm find.explain với cùng một phạm vi.

Tôi đã viết một hàm gọi là timeCount, tính trung bình của thời gian đếm hàm, sau đó hiển thị đầu ra giải nghĩa để so sánh.

function timeCount(coll, query) { 
    var n = 5; 
    var total = 0; 
    for(var i = 0; i < n; i++) { 
    var start = new Date(); 
    db[coll].find(query).count(); 
    var end = new Date(); 
    total += (end - start); 
    print("time[" + i + "]: " + (end - start) + "ms"); 
    } 
    print("average time: " + (total/n)); 

    var explain = db[coll].find(query).explain(); 
    print("explain (from find): "); 
    for(e in explain) { 
    if(typeof explain[e] == "string" || typeof explain[e] == "number") { 
     print(e + ": " + explain[e]); 
    } 
    } 
} 

Kết quả trông như thế này:

> timeCount('test',{x:{$gt:5000}}); 
time[0]: 1339ms 
time[1]: 1280ms 
time[2]: 1347ms 
time[3]: 1322ms 
time[4]: 1299ms 
average time: 1317.4 
explain (from find): 
cursor: BtreeCursor x_1_y_1 
nscanned: 995062 
nscannedObjects: 995062 
n: 995062 
millis: 1390 
nYields: 0 
nChunkSkips: 0 
+1

"Tôi khá chắc chắn rằng đếm (truy vấn) là viết tắt của tìm (truy vấn) .count() - nói cách khác, giải thích là chính xác như nhau." Có, nhưng bạn không thể dễ dàng có được một giải thích cho một trong hai: 'db.people.find ({}). Count(). Explain()' là một lỗi, giống như 'db.people.count ({}).) '. – Thilo

+1

Tôi vừa nói rằng giải thích từ find() sẽ cho bạn kết quả tương tự như một giải thích giả thuyết từ đếm. –

+2

Không, điều đó không có ý nghĩa. Một tìm kiếm phải lấy tài liệu, một số không. Với một chỉ số, nó sẽ tạo nên sự khác biệt lớn. – Thilo

0

Tại thời điểm này bạn có thể không phải là một explain() trên count() vì đếm đó là một lệnh và không phải là một con trỏ.

Đây là JIRA vấn đề theo dõi yêu cầu này: https://jira.mongodb.org/browse/SERVER-3493

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