2012-03-04 32 views
5

Tôi có một bộ sưu tập với chỉ số hợp chất trên bốn lĩnh vực theo thứ tự: (A, B, C, D)

Khi tôi truy vấn như

find({A: val1, B: val2, C: val3}).sort({D: 1}).limit(N) 

với nghiêm ngặt bằng trong các trường A, B, C nó chạy rất nhanh, như nó phải được. Và explain() cho tôi biết rằng chỉ có N tài liệu được quét.

Nếu tôi thay đổi một trong những bình đẳng để $in điều hành (với khoảng 100 nguyên tố trong mảng) nó quét số nhiều hơn nữa các văn bản và chạy chậm hơn nhiều:

find({A: {$in: [val0, val1, ...]}, B: val2, C: val3}).sort({D: 1}).limit(N) 

nhà khai thác khác như $or có tác dụng tương tự.

Hợp lý một $in với 100 phần tử phải rất giống với 100 truy vấn riêng lẻ với mức độ nghiêm ngặt bằng. Biến thể thứ hai chạy nhanh hơn nhiều trong cơ sở dữ liệu nhưng yêu cầu nhận được tất cả các phần tử (không giới hạn) với phân loại sau và hạn chế trên clientide.

Có ý nghĩa khi chia một truy vấn này với $in thành một số truy vấn bằng để làm cho con trỏ quét ít tài liệu hơn không? Điều gì sẽ hiệu quả hơn trong trường hợp hàng triệu tài liệu trong bộ sưu tập?

Trả lời

2

Bạn đã thử nghiệm với chỉ mục {B: 1, C: 1, A: 1, D: 1} chưa? Bằng cách đó, các giá trị B và C chính xác có thể được xử lý nhanh chóng, một phạm vi có thể được sử dụng trên trường A và sắp xếp theo D vẫn có thể được thực hiện thông qua chỉ mục.

+0

Như tài liệu cho biết, vì MongoDB v1.6.0 thứ tự các trường trong chỉ mục phức hợp không còn quan trọng nữa: http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ Tuy nhiên , Tôi đã thử biến thể của bạn và không có gì thay đổi. – DenisNP

+1

@DenisNP: nếu bạn muốn nói [this one] (http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-4.Conserveindexesbyreorderingcolumnsusedonequality%28nonrange%29queries.), Thì bạn đã hiểu sai rồi. Thứ tự các trường ** có ** vấn đề trong chỉ mục. Nó chỉ nói rằng bạn có thể bỏ qua một số lĩnh vực từ cuối (định nghĩa chỉ mục) mà không có hiệu suất nghiêm trọng hit. –

+0

@SergioTulentsev: Ý tôi là [khung màu vàng này] (http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-IndexingProperties). Liệu tôi có sai? – DenisNP