Làm cách nào để tạo nhiều chỉ mục văn bản trong MongoDB?

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:"[email protected]", 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:"[email protected]"})

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}})
0

và 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}})
3

Tạ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}})
4

nếu bạn tạo một chỉ mục trên altInfo như thế này

db.getCollection('users').find({age:{"$lt":30}})
5

sau đó 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}})
6

hoặc cái này

db.getCollection('users').find({age:{"$lt":30}})
7

Hạ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}})
8

sau đó điều này SẼ KHÔNG hoạt động

db.getCollection('users').find({age:{"$lt":30}})
9

Hơ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})
0

sau đó chèn này hoạt động

db.getCollection('users').createIndex({age:1})
1

và phần chèn này hoạt động

db.getCollection('users').createIndex({age:1})
2

nhưng KHÔNG phải cái này

db.getCollection('users').createIndex({age:1})
3

Hã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})
5

tì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})
6

Khi 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})
8

Lư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})
9

Khi 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})
0

Khi 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})
1

Khi 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})
2

Khi 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

Làm cách nào để tạo nhiều chỉ mục trong MongoDB?

Để tạo nhiều chỉ mục cùng một lúc, bạn cần phải sử dụng hàm createIndexes() và chuyển nhiều khóa vào một mảng .

Tôi có thể có nhiều chỉ mục trong MongoDB không?

MongoDB có thể sử dụng giao điểm của nhiều chỉ mục để thực hiện truy vấn . Nói chung, mỗi giao điểm chỉ số liên quan đến hai chỉ số; .

Bộ sưu tập MongoDB có thể có bao nhiêu chỉ mục văn bản?

Một bộ sưu tập có thể có tối đa một chỉ mục văn bản.

Chúng tôi có thể tạo nhiều chỉ mục trên cùng một bộ sưu tập trong MongoDB không?

Bạn có thể tạo nhiều chỉ mục trên cùng một (các) khóa với các đối chiếu khác nhau . Để tạo các chỉ mục có cùng một mẫu khóa nhưng các đối chiếu khác nhau, bạn phải cung cấp các tên chỉ mục duy nhất.