MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mongo Triple Compound Index

dòng dưới cùng / tl; dr: Chỉ mục b có thể được 'bỏ qua' nếu ac được truy vấn về bình đẳng hoặc bất bình đẳng, nhưng không phải, chẳng hạn, đối với các loại trên c .

Đây là một câu hỏi rất hay. Thật không may, tôi không thể tìm thấy bất kỳ điều gì có thẩm quyền trả lời chi tiết hơn về điều này. Tôi tin rằng hiệu suất của các truy vấn như vậy đã được cải thiện trong những năm qua, vì vậy tôi sẽ không tin tưởng vào tài liệu cũ về chủ đề này.

Toàn bộ vấn đề khá phức tạp vì nó phụ thuộc vào tính chọn lọc trên các chỉ mục của bạn và liệu bạn có truy vấn bình đẳng, bất bình đẳng và / hoặc sắp xếp hay không, vì vậy hãy explain() là người bạn duy nhất của bạn, nhưng đây là một số điều tôi tìm thấy:

Báo trước :Những gì xảy ra bây giờ là sự kết hợp của kết quả thực nghiệm, suy luận và phỏng đoán. Tôi có thể đang kéo dài sự loại suy của Kyle quá xa và Tôi thậm chí có thể hoàn toàn sai (và thật không may mắn, vì kết quả kiểm tra của tôi không khớp với lý do của tôi).

Rõ ràng là chỉ số của A có thể được sử dụng, tùy thuộc vào độ chọn lọc của A, chắc chắn rất hữu ích. 'Bỏ qua' B có thể khó hoặc không. Hãy giữ điều này tương tự như ví dụ về sách nấu ăn của Kyle:

French
    Beef
        ...
    Chicken
        Coq au Vin
        Roasted Chicken
    Lamb
        ...
    ...

Nếu bây giờ bạn yêu cầu tôi tìm một món ăn Pháp nào đó có tên "Chateaubriand", tôi có thể sử dụng chỉ mục A và vì tôi không biết thành phần nên tôi sẽ phải quét tất cả các món ăn trong A . Mặt khác, tôi biết rằng danh sách các món ăn trong mỗi danh mục được sắp xếp thông qua chỉ mục C , vì vậy tôi sẽ chỉ phải tìm các chuỗi bắt đầu bằng, chẳng hạn như, "Cha" trong mỗi danh sách thành phần. Nếu có 50 nguyên liệu, tôi sẽ cần 50 lần tra cứu thay vì chỉ một, nhưng điều đó tốt hơn rất nhiều so với việc phải quét từng món ăn Pháp!

Trong các thử nghiệm của tôi, con số này nhỏ hơn rất nhiều so với số lượng các giá trị khác biệt trong b :nó dường như không bao giờ vượt quá 2. Tuy nhiên, tôi chỉ kiểm tra điều này với một bộ sưu tập duy nhất và nó có thể liên quan đến tính chọn lọc của b -index.

Nếu bạn yêu cầu tôi cung cấp cho bạn danh sách tất cả các món ăn Pháp được sắp xếp theo thứ tự bảng chữ cái tuy nhiên, tôi sẽ gặp rắc rối . Bây giờ chỉ mục trên C là vô giá trị, tôi phải hợp nhất-sắp xếp tất cả các danh sách chỉ mục đó. Tôi sẽ phải quét mọi phần tử để làm như vậy.

Điều này phản ánh trong các bài kiểm tra của tôi. Dưới đây là một số kết quả được đơn giản hóa. Bộ sưu tập ban đầu có lịch ngày, số nguyên và chuỗi, nhưng tôi muốn giữ mọi thứ đơn giản, vì vậy bây giờ tất cả là số nguyên.

Về cơ bản, chỉ có hai lớp truy vấn:những lớp mà nscanned <=2 * limit , và những thứ phải quét toàn bộ bộ sưu tập (120 nghìn tài liệu). Chỉ mục là {a, b, c} :

// fast (range query on c while skipping b)
> db.Test.find({"a" : 43, "c" : { $lte : 45454 }});
// slow (sorting)
> db.Test.find({"a" : 43, "c" : { $lte : 45454 }}).sort({ "c" : -1});
> db.Test.find({"a" : 43, "c" : { $lte : 45454 }}).sort({ "b" : -1}); 

// fast (can sort on c if b included in the query)
> db.Test.find({"a" : 43, "b" : 7887, "c" : { $lte : 45454 }}).sort({ "c" : -1});

// fast (older tutorials claim this is slow)
> db.Test.find({"a" : {$gte : 43}, "c" : { $lte : 45454 }});

Số dặm của bạn sẽ thay đổi.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. nâng cấp mongodb

  2. MongoDB và tham gia

  3. Truyền dữ liệu NoSQL với MongoDB &Kafka

  4. Cassandra và MongoDB

  5. Tích hợp ClusterControl với SNMP:Phần thứ hai