Trong số các nhiệm vụ liên quan đến quản lý cơ sở dữ liệu là cải thiện hiệu suất bằng cách sử dụng các chiến lược khác nhau. Lập chỉ mục là một trong những mẹo giúp cải thiện hoạt động thông lượng bằng cách tạo điều kiện truy cập dữ liệu cho các yêu cầu truy vấn. Nó làm như vậy bằng cách giảm thiểu số lượng truy cập đĩa cần thiết khi một truy vấn được xử lý. Việc không sử dụng chỉ mục trong MongoDB sẽ buộc cơ sở dữ liệu thực hiện quét toàn bộ bộ sưu tập, nghĩa là quét qua tất cả các tài liệu trong bộ sưu tập để chọn tài liệu phù hợp với câu lệnh truy vấn đã phát hành. Rõ ràng, điều này sẽ mất rất nhiều thời gian, đặc biệt là nếu có quá nhiều tài liệu liên quan. Tóm lại, các chỉ mục hỗ trợ thực thi hiệu quả các truy vấn.
Chỉ mục MongoDB
Vì chúng tôi muốn lưu trữ nhiều tài liệu trong bộ sưu tập MongoDB, chúng tôi cần tìm cách lưu trữ một phần nhỏ dữ liệu cho mỗi tài liệu trong một phân vùng khác nhau để dễ dàng duyệt qua bằng cách sử dụng các chỉ mục. Một chỉ mục sẽ lưu trữ một giá trị trường cụ thể hoặc các trường và sau đó sắp xếp dữ liệu này theo thứ tự giá trị của trường đó. Với thứ tự này, các hoạt động truy vấn dựa trên phạm vi và đối sánh hiệu quả được hỗ trợ. Các chỉ mục được xác định ở cấp bộ sưu tập và chúng được hỗ trợ bởi bất kỳ trường nào hoặc trường nhúng của tài liệu trong bộ sưu tập.
Khi bạn tạo một tài liệu, MongoDB theo mặc định sẽ gán một trường _id nếu không được chỉ định và đặt trường này trở thành chỉ mục duy nhất cho tài liệu đó. Về cơ bản, điều này là để ngăn việc chèn cùng một tài liệu nhiều hơn những tài liệu trong bộ sưu tập đó. Ngoài ra, đối với một cụm phân đoạn, bạn nên sử dụng trường _id này như một phần của lựa chọn khóa phân đoạn, nếu không, phải có một số tính duy nhất của dữ liệu trong trường _id để tránh lỗi.
Tạo Chỉ mục cho Bộ sưu tập
Giả sử bạn đã chèn một số dữ liệu vào bộ sưu tập của mình và bạn muốn chỉ định một trường làm chỉ mục, bạn có thể sử dụng phương thức createIndex để đạt được điều này, tức là
Giả sử bạn có dữ liệu json này:
{
_id:1,
Name: “Sepp Maier”,
Country: “Germany”
}
Chúng ta có thể đặt trường Tên thành chỉ mục giảm dần bằng cách:
db.collection.createIndex({Name: -1})
Phương pháp này tạo một chỉ mục có cùng đặc điểm kỹ thuật nếu chưa tồn tại.
Các loại chỉ mục trong MongoDB
MongoDB liên quan đến các loại dữ liệu khác nhau do đó các loại chỉ mục khác nhau được tạo ra để hỗ trợ các loại dữ liệu và truy vấn này.
-
Trường đơn
Sử dụng một trường duy nhất của tài liệu, người ta có thể làm cho trường trở thành chỉ mục theo cách tăng dần hoặc giảm dần giống như ví dụ trên. Bên cạnh đó, bạn có thể tạo chỉ mục trên toàn bộ tài liệu nhúng, ví dụ:
{ _id: “xyz”, Contact:{ email: “[email protected]”, phone:”+420 78342823” }, Name: “Sergio” }
Trường liên hệ là một tài liệu được nhúng, do đó chúng ta có thể đặt nó thành một chỉ mục tăng dần bằng lệnh:
db.collection.createIndex({ Contact: 1})
Trong một truy vấn, chúng tôi có thể tìm nạp tài liệu như:
db.collection.find({ Contact: {email: “[email protected]”, phone:”+420 78342823”} })
Phương pháp hay nhất là tạo chỉ mục trong nền, đặc biệt khi có một lượng lớn dữ liệu vì ứng dụng cần truy cập dữ liệu trong khi xây dựng chỉ mục.
-
Chỉ mục tổng hợp
Chỉ mục tổng hợp thường được sử dụng để tạo điều kiện thuận lợi cho hoạt động sắp xếp trong một truy vấn và hỗ trợ các truy vấn phù hợp trên nhiều trường. Cú pháp để tạo chỉ mục kết hợp là:
db.collection.createIndex( { <field0>: <type>, <field1>: <type1>, ... } )
Tạo chỉ mục kết hợp cho dữ liệu mẫu bên dưới
{ _id: “1”, Name: “Tom”, Age: 24, Score:”80” } db.collection.createIndex({ Age: 1, Score:-1})
Cân nhắc:
- Giới hạn chỉ có 32 trường có thể được hỗ trợ.
- Giá trị của trường sẽ xác định loại chỉ mục, tức là 1 tăng dần và -1 giảm dần.
- Không tạo các chỉ mục kết hợp có loại chỉ mục được băm.
- Thứ tự của các trường được liệt kê trong chỉ mục ghép là quan trọng. Việc sắp xếp sẽ được thực hiện theo thứ tự của các trường.
-
Chỉ mục đa khóa
Tại một số thời điểm, bạn có thể có các trường với nội dung mảng được lưu trữ. Khi các trường này được lập chỉ mục, các mục nhập chỉ mục riêng biệt cho mọi phần tử sẽ được tạo. Do đó, nó giúp truy vấn chọn tài liệu bao gồm các mảng bằng cách so khớp trên phần tử hoặc các phần tử của mảng. Điều này được thực hiện tự động bởi MongoDB do đó không cần ai phải chỉ định rõ ràng loại multikey. Từ phiên bản 3.4, MongoDB theo dõi các trường được lập chỉ mục khiến chỉ mục trở thành chỉ mục đa khóa. Với theo dõi này, công cụ truy vấn cơ sở dữ liệu được phép sử dụng giới hạn chỉ mục chặt chẽ hơn.
Hạn chế của Multikey Index
- Chỉ có thể sử dụng một trường mảng trong lập chỉ mục multikey cho một tài liệu trong bộ sưu tập. I E. Bạn không thể tạo chỉ mục đa khóa cho lệnh và dữ liệu bên dưới
Bạn không thể tạo chỉ mục nhiều khóa{ _id: 1, nums: [ 1, 2 ], scores: [ 30, 60 ]}
{ nums: 1, scores: 1 }
- Nếu chỉ mục multikey đã tồn tại, bạn không thể chèn tài liệu vi phạm hạn chế này. Điều này có nghĩa là nếu chúng ta có
Sau khi tạo chỉ mục đa khóa ghép, cố gắng chèn tài liệu trong đó cả trường số và trường điểm đều là mảng, cơ sở dữ liệu sẽ không chèn được.{ _id: 1, nums: 1, scores: [ 30, 60 ]} { _id: 1, nums: [ 1, 2 ], scores: 30}
- Chỉ có thể sử dụng một trường mảng trong lập chỉ mục multikey cho một tài liệu trong bộ sưu tập. I E. Bạn không thể tạo chỉ mục đa khóa cho lệnh và dữ liệu bên dưới
-
Chỉ mục văn bản
Chỉ mục văn bản thường được sử dụng để cải thiện các truy vấn tìm kiếm một chuỗi trong tập hợp. Chúng không lưu trữ các từ dừng theo ngôn ngữ cụ thể (tức là “the”, ”a”, “hoặc”). Một bộ sưu tập có thể có nhiều nhất một chỉ mục văn bản. Để tạo chỉ mục văn bản:
db.collection.createIndex({Name:”text”})
Bạn cũng có thể lập chỉ mục nhiều trường, tức là
db.collection.createIndex({ Name:”text”, place:”text” })
Chỉ mục kết hợp có thể bao gồm khóa chỉ mục văn bản kết hợp với khóa chỉ mục tăng dần / giảm dần nhưng:
- Tất cả các khóa chỉ mục văn bản phải nằm liền kề trong tài liệu đặc tả chỉ mục khi tạo chỉ mục văn bản ghép.
- Không nên tham gia vào các loại chỉ mục đặc biệt khác, chẳng hạn như các trường chỉ mục đa khóa trong chỉ mục văn bản ghép.
- Để thực hiện tìm kiếm $ text, vị từ truy vấn phải bao gồm các điều kiện đối sánh bình đẳng trên các khóa trước đó.
-
Chỉ mục băm
Sharding là một trong những kỹ thuật được sử dụng trong MongoDB để cải thiện tỷ lệ theo chiều ngang. Sharding thường liên quan đến khái niệm dựa trên băm bằng cách sử dụng các chỉ mục được băm. Các chỉ số này mô tả sự phân bố ngẫu nhiên hơn của các giá trị dọc theo phạm vi của chúng, nhưng chỉ hỗ trợ các đối sánh bình đẳng và không thể hỗ trợ các truy vấn dựa trên phạm vi.
Xem xét hoạt động tổng thể cho các chỉ mục
- Mỗi chỉ mục yêu cầu ít nhất 8kB dung lượng dữ liệu.
- Khi hoạt động, mỗi chỉ mục sẽ sử dụng một số không gian đĩa và bộ nhớ. Điều này rất quan trọng khi được theo dõi trong quá trình lập kế hoạch năng lực.
- Đối với bộ sưu tập tỷ lệ đọc-ghi cao, các chỉ mục bổ sung sẽ cải thiện hiệu suất và không ảnh hưởng đến các hoạt động đọc chưa được lập chỉ mục.
Hạn chế của việc sử dụng chỉ mục
- Việc thêm chỉ mục có một số tác động tiêu cực đến hiệu suất đối với các hoạt động ghi, đặc biệt là đối với các bộ sưu tập có tỷ lệ ghi để đọc cao. Chỉ mục sẽ đắt ở chỗ mỗi lần chèn cũng phải cập nhật bất kỳ chỉ mục nào.
- MongoDB sẽ không tạo, cập nhật chỉ mục hoặc chèn vào bộ sưu tập được lập chỉ mục nếu mục nhập chỉ mục cho tài liệu hiện có vượt quá giới hạn khóa chỉ mục.
- Đối với các tập hợp phân đoạn hiện có, quá trình di chuyển phân đoạn sẽ không thành công nếu phân đoạn có tài liệu chứa trường được lập chỉ mục có mục nhập chỉ mục vượt quá giới hạn khóa chỉ mục.
Kết luận
Có rất nhiều cách để cải thiện hiệu suất MongoDB, lập chỉ mục là một trong số đó. Lập chỉ mục tạo điều kiện thuận lợi cho các hoạt động truy vấn bằng cách giảm độ trễ mà dữ liệu được truy xuất bằng cách nào đó giảm thiểu số lượng tài liệu cần được quét. Tuy nhiên, có một số cân nhắc mà người ta cần thực hiện trước khi quyết định sử dụng một loại chỉ mục cụ thể. Các bộ sưu tập có tỷ lệ đọc-ghi cao có xu hướng sử dụng các chỉ mục tốt hơn các bộ sưu tập có các thao tác ghi để đọc cao.