-->
ads here

Giới thiệu về Index trong MongoDB

advertise here

Xin chào các bạn, hôm nay mình sẽ giới thiệu đến mọi người về một khái niệm rất quan trong trong MongoDB cũng như các hệ quản trị cơ sở dữ liệu khác. Đó là index.

enter image description here

1. Khái niệm về chỉ mục (Index)

Trong các hệ cơ sở dữ liệu khác, index là một dạng cấu trúc dữ liệu được dùng để tăng tốc độ đọc dữ liệu trong cơ sở dữ liệu.

Cụ thể, trong MongoDB, Index là một cấu trúc dữ liệu đặc biệt, nó lưu trữ một phần nhỏ dữ liệu của collection ở một dạng dễ dàng duyệt được. Index lưu trữ giá trị của một trường cụ thể hoặc 1 tập hợp các trường của collection và được sắp xếp theo giá trị của các trường đó. Thứ của các index entries hỗ trợ cho các tác vụ truy vấn bằng (equality matches) và truy vấn theo khoảng (range-based). Thêm vào đó, MongoDB có thể trả về tập kết quả đã được sắp xếp bằng việc sử dụng thứ tự (ordering) trong index.

Index hỗ trợ thực thi có hiệu quả các câu truy vấn trong MongoDB. Nếu không có index, MongoDB phải thực hiện collection scan, tức là quét qua hết tất cả các document trong collection để tìm được những document khớp với điều kiện truy vấn. Vì vậy khi số lượng document trong collection càng tăng lên, ta phải quét qua rất rất nhiều document để có được kết quả truy vấn.
Tuy nhiên, nếu có index, thay vì phải scan qua từng document, thì MongoDB chỉ cần tìm trong trong index. Với 1 cặp key-value được lưu trữ, key là giá trị của trường được đánh chỉ mục, và value là chính document, ta sẽ giảm được số lượng document cần phải duyệt qua để thỏa mãn câu truy vấn. Từ đó tối ưu và tăng tốc độ truy vấn dữ liệu.

enter image description here

MongoDB sử dụng cấu trúc dữ liệu b-tree để hiện thực index
enter image description here

Về cơ bản, index trong MongoDB cũng tương tự index trong các hệ cơ sở dữ liệu khác. MongoDB cũng hỗ trợ define index ở collection level, và ta có thể tạo chỉ mục index ở bất kì field hay sub-field nào của collection trong MongoDB.

2. Các loại index trong mongoDB

Single Index

Bên cạnh index mặc định của MongoDB trên field _id, chúng ta còn có thể tạo chủ mục riêng của mình trên 1 field của document
Chúng ta có thể khởi tạo index bằng hàm createIndex trong collection

$ db.user.createIndex({ email: 1}); # Create single index on email field of user collection

Ta cũng có thể tạo index cho subfield của document
Ví dụ collection user có cấu trúc như sau:

User: { email: "email@gmail.com", name: { firstname: "Dong", lastname: "Julian", } }

Ta có thể đánh index cho subfield lastname như sau:

$ db.user.createIndex({ "name.lastname": 1});

Compound index

MongoDB cho phép tạo index trên nhiều field của document, gọi là compound index

$ db.user.createIndex({ email: 1, userName:-1});

Tạo chỉ mục trên 2 field là emailuserName của collection user. Thứ tự của các field trong việc tạo chỉ mục rất quan trọng. Trong ví dụ ở trên, index sẽ sắp xếp trước tiên theo email trước, bên trong mỗi email sẽ sắp xếp theo userName

Multikey index

MongoDB sử dụng Multikey index để đánh index cho những content được lưu trong mảng. Nếu ta đánh chỉ mục trên field mà chứa giá trị là mảng thì MongoDB sẽ tạo những index entries riêng biệt cho mỗi phần tử của mảng
enter image description here
Trong hình trên ta có thể tạo multikey index như sau:

$ db.user.createIndex( {"addr.zip":1})

3. Một số thuộc tính khi tạo index

Unique index

Khi ta thêm thuộc tính unique vào index thì MongoDB sẽ reject những giá trị trùng lặp trên field đã được đánh index
Ví dụ

$ db.user.createIndex({ name: 1 }, {unique: true})

Thì khi đó MongoDB sẽ ngăn chặn việc thêm mới 1 document mà có giá trị name trùng với document đã có sẵn.
Khi ta thêm 1 document mà có thiếu field được đánh index thì ta vẫn tạo được document với field đó bị thiếu. Tuy nhiên index sẽ trả về lỗi nếu ta cố tình tiếp tục thêm document thiếu indexed field vào collection đã có document thiếu indexed field

Partially index

Chúng ta có thể đánh index trên một số document của collection mà thỏa mãn một số điều kiện nhất định. Bằng việc đánh index trên 1 tập con của các document trong collection, partially index chỉ yêu cầu bộ nhớ ít hơn và giảm performance costs khi tạo và duy trì index
Để tạo Partially index, ta cần thêm partialFilterExpression option khi tạo index

$ db.restaurant.createIndex( { cuisine: 1, name: 1 }, { partialFilterExpression: {rating: { $gt: 5 } } } , )

Như trên ta có thể thấy, chỉ mục được đánh trên field cuisinename của các document thuộc có collection restaurand những có rating > 5

Sparse index

Sparse index là index chỉ chứa những document có field được đánh index có giá trị (kể cả giá trị null). Để tạo sparse index, ta thêm option sparse: true khi tạo index.

$ db.student.createIndex( {score: 1}, {sparse: true} )

Trong ví dụ trên, những document nào có field score mới được đánh index
Tương tự như partially index, thì sparse index không bao gồm toàn bộ document của collection.

4. Đánh đổi

Để có được performance tốt cho các câu truy vấn ta cũng cần phải đánh đổi khi sử dụng index. Cụ thể như sau:

  • Với mỗi index được tạo ra trong collection, thì tốc độ ghi lên collection đó sẽ giảm. Và trong mongoDB chúng ta cũng chỉ có thể tạo tối da 64 index trên mỗi collection
  • Index được hiện thực bằng b-tree, vậy nên mỗi khi một document trong collection bị thay đổi hoặc bị xóa hoàn toàn thì b-tree sẽ phải cân bằng lại. Chúng ta nên thật cẩn thận khi sử dụng index
  • Khi có quá nhiều không cần thiết index được tạo ra trong collection thì hiệu suất của các thao tác insert, delete hay update sẽ bị giảm đáng kể không cần thiết

Kết:

Hi vọng qua bài viết này mọi người sẽ hiểu được cách sử dụng index trong MongoDB để có thể dùng trong dự án thực tế của mình
Nếu thấy bài viết hay hãy chia sẻ cho mọi người cùng biết. Nếu có ý kiến đóng góp đừng ngần ngại để lại comment bên dưới nhé.
Thanks

Reference:

Advertisement
COMMENTS ()