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

MongoDB Tìm hiệu suất:chỉ số phức hợp đơn VS hai chỉ mục trường đơn

Đưa ra một truy vấn tiêu chuẩn thuần túy (không có limit() hoặc sort() hoặc bất kỳ thứ gì ưa thích được áp dụng) có điều kiện lọc trên hai trường (như trong nameage trong ví dụ của bạn), để tìm các tài liệu kết quả, MongoDB sẽ:

  1. thực hiện quét toàn bộ bộ sưu tập (đọc mọi tài liệu trong toàn bộ bộ sưu tập, phân tích cú pháp BSON, tìm các giá trị được đề cập, kiểm tra chúng so với đầu vào và trả về / loại bỏ từng tài liệu):Đây là I / O siêu dữ dội và do đó rất chậm.
  2. sử dụng một chỉ mục chứa một trong các trường (sử dụng cây chỉ mục để xác định tập hợp con có liên quan của tài liệu sau khi quét chúng):Tùy thuộc vào phân phối dữ liệu / tính chọn lọc chỉ mục của bạn, điều này có thể rất nhanh hoặc hầu như không mang lại bất kỳ lợi ích nào (hãy tưởng tượng một chỉ mục trên age trong tập dữ liệu gồm hàng triệu người từ 30 đến 40 năm -> mọi lần tra cứu vẫn mang lại vô số tài liệu).
  3. sử dụng hai chỉ mục cùng chứa cả hai trường được đề cập (tải cả hai chỉ mục, thực hiện tra cứu khóa, sau đó tính toán giao điểm của các kết quả):Một lần nữa, tùy thuộc vào phân phối dữ liệu của bạn, điều này có thể mang lại cho bạn hiệu suất (er) tốt hoặc không. Tuy nhiên, trong hầu hết các trường hợp, nó sẽ nhanh hơn # 2. Tuy nhiên, tôi sẽ ngạc nhiên nếu nó thực sự chậm hơn 10 lần so với số 4 (như bạn đã đề cập).
  4. sử dụng chỉ mục kết hợp (hai lần tra cứu khóa tiếp theo ngay lập tức dẫn đến các tài liệu được yêu cầu):Đây sẽ là tùy chọn nhanh nhất trong số tất cả các tùy chọn vì nó yêu cầu các thao tác ít nhất và rẻ nhất để có được các tài liệu phù hợp. Để đảm bảo mức độ tái sử dụng lớn nhất (không phải hiệu suất sẽ không bị ảnh hưởng bởi điều này), nói chung, trước tiên, bạn nên bắt đầu với trường chọn lọc nhất, vì vậy trong trường hợp của bạn có thể là name chứ không phải age cho rằng nhiều người sẽ có cùng age (tính chọn lọc quá thấp) so với name (độ chọn lọc cao hơn). Nhưng lựa chọn đó cũng phụ thuộc vào kịch bản cụ thể của bạn và các truy vấn bạn định chạy trên cơ sở dữ liệu của mình. Có một bài viết khá hay trên web về cách xác định tốt nhất một chỉ số kết hợp có tính đến các khía cạnh khác nhau của tình huống cụ thể của bạn:https://emptysqua.re/blog/optimizing-mongodb-compound-indexes

Các khía cạnh khác cần xem xét là:Cập nhật chỉ số ở một mức giá nhất định. Tuy nhiên, nếu tất cả những gì bạn quan tâm là tốc độ đọc thô và thỉnh thoảng bạn chỉ có một vài bản cập nhật, thì bạn nên sử dụng nhiều chỉ mục hơn / lớn hơn.

Và cuối cùng nhưng không kém phần quan trọng (!) Lời khuyên cuối cùng đã được sử dụng quá mức:Lập hồ sơ cho hệ thống của bạn bằng cách sử dụng dữ liệu thực và thậm chí có thể là các kịch bản tải thực tế. Và cũng tiếp tục đo lường khi dữ liệu / hệ thống của bạn thay đổi theo thời gian.

Các bài đọc bổ sung:https://docs.mongodb.com/manual/core/query-optimization/index.html

https://dba.stackexchange.com/questions/158240/mongodb-index-intersection-does-not-eliminate-the-need-for-creating-compound-in

Giao điểm của chỉ số so với chỉ số kết hợp?

mongodb compund index so với index giao nhau

Thứ tự của các chỉ mục ghép quan trọng như thế nào trong hiệu suất MongoDB?

Trong MongoDB, tôi đang sử dụng một truy vấn lớn, cách tôi sẽ tạo chỉ mục kết hợp hoặc chỉ mục đơn, Vì vậy, thời gian phản hồi của tôi sẽ tăng lên




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để kích hoạt xác thực trên MongoDB thông qua Docker?

  2. Nâng cấp lên ClusterControl Enterprise Edition

  3. Tài liệu ClusterControl 1.5 - Có gì mới

  4. Nhóm và đếm với điều kiện

  5. Mongodb tìm bên trong mảng phụ