Quá trình này mất khoảng 4 giây để thực thi cục bộ. Điều này là do Mongo phải quét toàn bộ bản ghi 100MM để xác định người dùng nào dưới 30 tuổi
Bây giờ, hãy thêm một chỉ mục vào trường tuổi
db.getCollection('users').createIndex({age:1})Khi chúng tôi chạy cùng một truy vấn, sẽ mất khoảng một nửa thời gian để thực hiện. Đây là lý do tại sao lập chỉ mục rất quan trọng và mạnh mẽ trong MongoDB
Lập chỉ mục hoạt động như thế nào?
Khi bạn tạo một chỉ mục, Mongo sẽ sao chép một phần dữ liệu bộ sưu tập thành cấu trúc dữ liệu B-Tree được sắp xếp. Cấu trúc cây được sắp xếp này cho phép tra cứu nhanh hơn. Thay vì quét toàn bộ bộ sưu tập, Mongo có thể duyệt B-Tree này để tìm dữ liệu mà nó quan tâm hiệu quả hơn
Mặc dù việc lập chỉ mục có thể tạo ra những lợi ích lớn về hiệu suất, nhưng việc duy trì chỉ mục cũng phải trả phí. Khi các bản ghi được chèn vào một bộ sưu tập, chỉ mục phải được cập nhật với dữ liệu mới. Hãy nhớ rằng việc lập chỉ mục một bộ sưu tập cuối cùng sẽ làm tăng kích thước cơ sở dữ liệu của bạn
Vì những lý do này, điều quan trọng là chỉ sử dụng các chỉ mục khi thích hợp. Lập chỉ mục các bộ sưu tập dựa trên các trường được truy vấn nhiều nhất là một điểm khởi đầu tốt
Tạo một chỉ mục trường đơn
db.getCollection('users').createIndex({age:1})Điều này tạo ra một chỉ mục trường duy nhất trên bộ sưu tập người dùng
1 chỉ định thứ tự (tăng dần) so với -1 giảm dần
Lưu ý rằng đối với một chỉ mục trường, thứ tự không thành vấn đề. Bạn sẽ nhận được những lợi ích của B-Tree được sắp xếp theo một trong hai cách. )
Khi nào bạn nên sử dụng một chỉ mục trường duy nhất?
Sử dụng một chỉ mục trường duy nhất khi bạn thường xuyên truy vấn theo một trường
Tạo một chỉ số hợp chất
db.getCollection('users').createIndex({email:1, name:-1})Điều này tạo ra một chỉ mục tổng hợp trên bộ sưu tập người dùng
Điều này cực kỳ hữu ích để hỗ trợ các truy vấn như thế này
db.getCollection('users').find({email:"alex@gmail.com", name:"Sam"})Chỉ số phức hợp này cũng có thể được tận dụng cho một truy vấn đơn giản hơn như thế này
db.getCollection('users').find({email:"alex@gmail.com"})nhưng KHÔNG phải cái này
db.getCollection('users').find({name:"Sam"})Lý do là Mongo sử dụng tiền tố (hoặc tập hợp con đầu của các trường được lập chỉ mục). Để mở rộng này, thứ tự của các trường trong chỉ mục quan trọng. Nếu không có trường email được đưa vào truy vấn, Mongo không thể tận dụng chỉ mục phức hợp để truy vấn theo tên
Chỉ mục hợp chất và sắp xếp
Điều này cực kỳ hữu ích để hỗ trợ các truy vấn sắp xếp như thế này
db.getCollection('users').find().sort({email:1, name:-1})hoặc cái này
db.getCollection('users').find().sort({email:-1, name:1})nhưng KHÔNG phải cái này
db.getCollection('users').find({age:{"$lt":30}}) 0và cũng KHÔNG phải cái này
db.getCollection('users').find({age:{"$lt":30}}) 1Điều này là do các chỉ mục chỉ có thể được tận dụng trong các hoạt động sắp xếp nếu thứ tự của các trường khớp với thứ tự của các trường được xác định trong chỉ mục. Ngoài ra, chỉ mẫu khóa chỉ mục (email. 1, tên. -1) và ngược lại (email. -1, tên. 1) có thể áp dụng cho các thao tác sắp xếp
Khi nào bạn nên sử dụng một chỉ số phức hợp?
Sử dụng chỉ mục tổng hợp khi bạn thường xuyên truy vấn trên nhiều trường. Ngoài ra, hãy nhớ rằng bạn không cần xác định chỉ mục trường đơn nếu chỉ mục ghép của bạn khớp với tiền tố của trường chỉ mục. hay còn gọi là
db.getCollection('users').createIndex({email:1, name:-1})cũng thỏa mãn
db.getCollection('users').find({age:{"$lt":30}}) 3Tạo một Multikey Index
Chỉ mục đa khóa là thứ mà MongoDB tự động tạo cho bạn dựa trên các trường chứa mảng
Giả sử cấu trúc tài liệu của bộ sưu tập của bạn trông như thế này
db.getCollection('users').find({age:{"$lt":30}}) 4nếu bạn tạo một chỉ mục trên altInfo như thế này
db.getCollection('users').find({age:{"$lt":30}}) 5sau đó Mongo sẽ tự động tạo một chỉ mục đa điểm
Điều này cũng áp dụng cho các tài liệu phụ. Ví dụ: bạn cũng có thể tạo một chỉ mục như thế này
db.getCollection('users').find({age:{"$lt":30}}) 6hoặc cái này
db.getCollection('users').find({age:{"$lt":30}}) 7Hạn chế đối với Multikey Indexes
Chỉ mục nhiều phím chỉ hoạt động khi một trường trong tài liệu là một mảng
Ví dụ: nếu dữ liệu của bạn trông như thế này
db.getCollection('users').find({age:{"$lt":30}}) 8sau đó điều này SẼ KHÔNG hoạt động
db.getCollection('users').find({age:{"$lt":30}}) 9Hơn nữa, nếu đã tồn tại một chỉ mục nhiều phím phức hợp và bạn cố gắng thêm một tài liệu mới với nhiều trường có mảng hơn, thao tác chèn sẽ không thành công
Ví dụ: nếu bạn tạo chỉ mục tổng hợp này
db.getCollection('users').createIndex({age:1}) 0sau đó chèn này hoạt động
db.getCollection('users').createIndex({age:1}) 1và phần chèn này hoạt động
db.getCollection('users').createIndex({age:1}) 2nhưng KHÔNG phải cái này
db.getCollection('users').createIndex({age:1}) 3Hãy nhớ rằng các chỉ mục đa phím được xử lý chủ yếu ở hậu trường cho bạn. Điều quan trọng là phải hiểu khi chúng được tạo và những hạn chế mà chúng đưa ra khi chèn/truy vấn tài liệu với các trường mảng
Tạo một chỉ mục văn bản
db.getCollection('users').createIndex({age:1}) 4Điều này tạo ra. một chỉ mục văn bản trên trường tên. Điều này cho phép bạn chạy các tìm kiếm $text trong Mongo
db.getCollection('users').createIndex({age:1}) 5tìm kiếm $text là một cách ưa thích để tìm kiếm các trường chuỗi dựa trên văn bản trong Mongo. Bạn không thể chạy các truy vấn dựa trên văn bản $ mà không có chỉ mục văn bản
Một bộ sưu tập chỉ có thể có một chỉ mục văn bản. Tin vui là một chỉ mục văn bản có thể bao gồm nhiều trường
db.getCollection('users').createIndex({age:1}) 6Khi nào bạn nên tạo một chỉ mục văn bản?
Tạo một chỉ mục văn bản khi bạn muốn tìm kiếm các trường dựa trên chuỗi với $text
Tạo chỉ mục ký tự đại diện
db.getCollection('users').createIndex({age:1}) 7Điều này tạo ra một chỉ mục ký tự đại diện sẽ lập chỉ mục tất cả các trường con/thành phần cho một trường nhất định
Chỉ số này có ý nghĩa nếu dữ liệu của bạn trông như thế này
db.getCollection('users').createIndex({age:1}) 8Lưu ý cách altInfo lưu trữ các thuộc tính và kiểu dữ liệu khác nhau. Đây là một lợi thế chính của thiết kế "không lược đồ" của MongoDB vì các thuộc tính có thể được thêm vào một cách nhanh chóng
Khi nào bạn nên tạo chỉ mục ký tự đại diện?
Tạo chỉ mục ký tự đại diện có ý nghĩa khi bạn muốn lập chỉ mục các trường có thuộc tính/phần tử phụ không được biết. Điều này hoạt động như một "bắt tất cả" để lập chỉ mục một lược đồ linh hoạt trong MongoDB
Mặc dù các chỉ mục ký tự đại diện cực kỳ thuận tiện, nhưng chúng không nên được coi là một lối tắt để lập chỉ mục riêng lẻ trên các trường. Điều này là do có một chi phí hiệu suất lớn để quản lý một chỉ mục linh hoạt như vậy. Cụ thể, các bản cập nhật, đọc và xóa có thể mất nhiều thời gian hơn theo cấp số nhân khi sử dụng các chỉ mục ký tự đại diện
Các loại chỉ mục khác
Hỗ trợ truy vấn không gian địa lý
MongoDB hỗ trợ dữ liệu Không gian địa lý thông qua dữ liệu GeoJSON và các cặp tọa độ kế thừa. Dữ liệu không gian địa lý mô tả các đối tượng khi chúng liên quan đến bề mặt trái đất
Chỉ mục 2dsphere
db.getCollection('users').createIndex({age:1}) 9Khi nào bạn nên sử dụng chỉ mục 2dsphere?
Sử dụng chỉ mục 2dsphere khi bạn muốn thực hiện các truy vấn tính toán hình học trên một hình cầu giống như trái đất
Chỉ mục 2d
db.getCollection('users').createIndex({age:1}) 0Khi nào bạn nên sử dụng 2dIndex?
Sử dụng chỉ mục 2d khi bạn muốn truy vấn dữ liệu được lưu trữ dưới dạng điểm trong mặt phẳng hai chiều
chỉ mục geoHaystack
db.getCollection('users').createIndex({age:1}) 1Khi nào bạn nên sử dụng chỉ mục geoHaystack?
Sử dụng chỉ mục geoHaystack khi bạn muốn thực hiện các truy vấn trên dữ liệu không gian địa lý trên một khu vực vật lý nhỏ
Chỉ mục băm
db.getCollection('users').createIndex({age:1}) 2Khi nào bạn nên sử dụng chỉ mục băm?
Sử dụng các chỉ mục được băm khi bạn muốn lập chỉ mục dữ liệu được phân vùng trên một cụm phân đoạn
Phần kết luận
Lập chỉ mục cơ sở dữ liệu của bạn là một trong những phần khó khăn và quan trọng nhất của thiết kế cơ sở dữ liệu phi quan hệ. Điều quan trọng là phải hiểu bản chất của ứng dụng của bạn và trường nào bạn sẽ truy vấn thường xuyên nhất khi thiết kế chiến lược lập chỉ mục của mình
Mặc dù lập chỉ mục được thiết kế để giúp việc truy vấn cơ sở dữ liệu của bạn nhanh hơn, nhưng hãy nhớ rằng có một chi phí cơ hội đối với tất cả việc lưu giữ sổ sách. Điều này là do các chỉ mục phải được duy trì và cuối cùng là tăng kích thước cơ sở dữ liệu của bạn