2012-12-15 39 views
10

Có rất nhiều chi phí trong việc loại trừ gần như tất cả dữ liệu trong tài liệu khi truy vấn cơ sở dữ liệu mongo không?Dự đoán MongoDB hiệu quả như thế nào?

Ví dụ, trong trường hợp tôi chỉ muốn field1field2, đối với một bộ sưu tập với một cấu trúc tài liệu của:

{ 
    "field1" : 1 
    "field2" : true 
    "field3" : ["big","array",...] 
    "field4" : ["another","big","array",...] 
} 

tôi sẽ được hưởng lợi nhiều hơn từ:

  1. Tạo bộ sưu tập riêng biệt bên cạnh bộ sưu tập này chứa trường duy nhất1 và trường2 hoặc
  2. Sử dụng .f ind() trên các chứng từ ban đầu với bao gồm/loại trừ thông số

Lưu ý: không hiệu quả tiết kiệm cùng một dữ liệu hai lần không phải là một mối quan tâm đối với tôi càng nhiều càng hiệu quả của truy vấn dữ liệu

Rất cám ơn !

+0

các tài liệu này lớn đến mức nào? –

+0

@AsyaKamsky Khoảng 0,3MB mỗi trường và field1 và field2 kết hợp <1kB. Kích thước tài liệu có hiệu lực không? – Ash

+0

nó tạo sự khác biệt về số lượng tài liệu RAM mất từ ​​khi bạn truy vấn tài liệu, toàn bộ tài liệu có thể kết thúc trong RAM ngay cả khi bạn chỉ muốn một số trường cụ thể. Hai trường bạn muốn luôn là hai trường đầu tiên? –

Trả lời

5

Phép chiếu tương tự như sử dụng tên cột một cách rõ ràng trong SQL, do đó, có vẻ như một chút phản trực quan để hỏi xem có trả lại lượng dữ liệu nhỏ hơn không sẽ vượt quá số lượng dữ liệu lớn hơn (toàn bộ tài liệu).

Vì vậy, bạn phải tìm tài liệu (tùy thuộc vào cách bạn .find() nó có thể nhanh hoặc chậm) nhưng chỉ trả lại hai trường đầu tiên của tài liệu thay vì tất cả các trường (tài liệu hoàn chỉnh) sẽ làm cho nó nhanh hơn không chậm hơn.

Việc thu thập thứ hai chỉ có thể được hưởng lợi nếu bạn quan tâm đến bộ sưu tập của mình phù hợp với RAM. Nếu các tài liệu trong bộ sưu tập trùng lặp nhỏ hơn nhiều thì chúng có thể phù hợp với một lượng RAM nhỏ hơn làm giảm khả năng một trang sẽ cần được hoán đổi từ đĩa. Tuy nhiên, nếu bạn đang viết thư cho bộ sưu tập này cũng như bộ sưu tập gốc thì bạn phải có nhiều dữ liệu trong RAM hơn là nếu bạn chỉ có bộ sưu tập gốc. Vì vậy, trong khi các chi tiết phức tạp có thể phụ thuộc vào thiết lập cá nhân của bạn, câu trả lời chung có lẽ sẽ là 2. bạn sẽ được hưởng lợi nhiều hơn từ việc sử dụng phép chiếu và chỉ trả về hai trường bạn cần.

+0

Cảm ơn bạn đã trả lời rất chi tiết! Một câu hỏi nữa, nếu tôi lập chỉ mục trên field1 và field2 và truy vấn cho một tập con của bộ sưu tập trên 2 trường này, điều này sẽ chỉ tải tập hợp con dữ liệu đó vào RAM? Xin lỗi vì sự thiếu hiểu biết của tôi về cơ sở dữ liệu. – Ash

+1

chỉ những trang chứa tài liệu bạn cần sẽ được tải vào RAM. Tất nhiên chỉ số cũng sẽ ở trong RAM. –

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