Redsandro,
Bạn phải xem xét Index Cardinality
và Selectivity
.
1. Chỉ mục Cardinality
Cardinality chỉ mục đề cập đến số lượng giá trị có thể có cho một trường. Trường sex
chỉ có hai giá trị có thể. Nó có bản số rất thấp . Các trường khác như tên names, usernames, phone numbers, emails
, v.v. sẽ có một giá trị duy nhất cho mọi tài liệu trong bộ sưu tập, được coi là bản số cao .
-
Số lượng lớn hơn
Số lượng của một trường càng lớn thì chỉ mục càng hữu ích, bởi vì các chỉ mục thu hẹp không gian tìm kiếm, làm cho nó trở thành một tập hợp nhỏ hơn nhiều.
Nếu bạn có chỉ mục về
sex
và bạn đang tìm kiếm những người đàn ông tên John. Bạn sẽ chỉ thu hẹp không gian kết quả khoảng% 50 nếu bạn lập chỉ mục theosex
Đầu tiên. Ngược lại nếu bạn lập chỉ mục theoname
, bạn sẽ ngay lập tức thu hẹp kết quả được đặt thành một phần nhỏ của người dùng có tên John, sau đó bạn sẽ tham khảo các tài liệu đó để kiểm tra giới tính. -
Quy tắc ngón tay cái
Cố gắng tạo chỉ mục trên
high-cardinality
khóa hoặc đặthigh-cardinality
khóa đầu tiên trong chỉ mục ghép. Bạn có thể đọc thêm về nó trong phần về chỉ mục ghép trong cuốn sách:MongoDB Hướng dẫn cuối cùng
2. Tính chọn lọc
Ngoài ra, bạn muốn sử dụng chỉ mục một cách chọn lọc và viết các truy vấn giới hạn số lượng tài liệu có thể có với trường được lập chỉ mục. Để giữ cho nó đơn giản, hãy xem xét bộ sưu tập sau đây. Nếu chỉ mục của bạn là {name:1}
, Nếu bạn chạy truy vấn { name: "John", sex: "male"}
. Bạn sẽ phải quét 1
tài liệu. Vì bạn đã cho phép MongoDB có chọn lọc.
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
Hãy xem xét bộ sưu tập sau đây. Nếu chỉ mục của bạn là {sex:1}
, Nếu bạn chạy truy vấn {sex: "male", name: "John"}
. Bạn sẽ phải quét 4
tài liệu.
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
Hãy tưởng tượng những khác biệt có thể có trên một tập dữ liệu lớn hơn.
Giải thích một chút về Chỉ số tổng hợp
Rất dễ tạo ra giả định sai về Chỉ số tổng hợp. Theo tài liệu của MongoDB về Chỉ số tổng hợp.
MongoDB hỗ trợ các chỉ mục phức hợp, trong đó một cấu trúc chỉ mục duy nhất giữ các tham chiếu đến nhiều trường trong các tài liệu của bộ sưu tập. Biểu đồ sau minh họa một ví dụ về chỉ mục kết hợp giữa hai trường:
Khi bạn tạo chỉ mục kết hợp, 1 Chỉ mục sẽ chứa nhiều trường. Vì vậy, nếu chúng tôi lập chỉ mục một bộ sưu tập theo {"sex" : 1, "name" : 1}
, chỉ mục sẽ giống như sau:
["male","Rick"] -> 0x0c965148
["male","John"] -> 0x0c965149
["male","Sean"] -> 0x0cdf7859
["male","Bro"] ->> 0x0cdf7859
...
["female","Kate"] -> 0x0c965134
["female","Katy"] -> 0x0c965126
["female","Naji"] -> 0x0c965183
["female","Joan"] -> 0x0c965191
["female","Sara"] -> 0x0c965103
Nếu chúng tôi lập chỉ mục bộ sưu tập theo {"name" : 1, "sex" : 1}
, chỉ mục sẽ giống như sau:
["John","male"] -> 0x0c965148
["John","female"] -> 0x0c965149
["John","male"] -> 0x0cdf7859
["Rick","male"] -> 0x0cdf7859
...
["Kate","female"] -> 0x0c965134
["Katy","female"] -> 0x0c965126
["Naji","female"] -> 0x0c965183
["Joan","female"] -> 0x0c965191
["Sara","female"] -> 0x0c965103
Có {name:1}
vì Tiền tố sẽ phục vụ bạn tốt hơn nhiều trong việc sử dụng các chỉ mục ghép. Còn nhiều điều có thể đọc về chủ đề này, tôi hy vọng điều này có thể cung cấp một số thông tin rõ ràng.