Trang này mô tả quy trình lập chỉ mục cho Cloud Firestore. Cloud Firestore theo mặc định không tạo chỉ mục nào. Để cải thiện hiệu suất cơ sở dữ liệu, hãy tạo chỉ mục cho các truy vấn thường dùng nhất.
Chỉ mục có tác động lớn đến hiệu suất của cơ sở dữ liệu. Nếu có chỉ mục cho một truy vấn, thì cơ sở dữ liệu có thể trả về kết quả một cách hiệu quả bằng cách giảm lượng dữ liệu cần quét và giảm công việc cần thiết để sắp xếp kết quả. Tuy nhiên, các mục chỉ mục làm tăng chi phí lưu trữ và lượng công việc được thực hiện trong quá trình ghi vào các trường được lập chỉ mục.
Định nghĩa và cấu trúc chỉ mục
Một chỉ mục bao gồm những thành phần sau:
- mã bộ sưu tập
- danh sách các trường trong bộ sưu tập đã cho
- thứ tự (tăng dần hoặc giảm dần) cho từng trường
Chỉ mục cũng có thể bật các tuỳ chọn thưa thớt, nhiều khoá hoặc duy nhất.
Thứ tự chỉ mục
Thứ tự và hướng sắp xếp của từng trường xác định riêng chỉ mục. Ví dụ: các chỉ mục sau đây là 2 chỉ mục riêng biệt và không thể thay thế cho nhau:
| Thu thập | Trường |
|---|---|
| thành phố | quốc gia (tăng dần), dân số (giảm dần) |
| thành phố | dân số (giảm dần), quốc gia (tăng dần), |
Khi tạo chỉ mục để hỗ trợ một truy vấn, hãy đưa các trường vào theo cùng thứ tự như truy vấn của bạn.
Mật độ chỉ mục
Theo mặc định, các mục chỉ mục lưu trữ dữ liệu từ tất cả tài liệu trong một bộ sưu tập. Đây được gọi là chỉ mục không thưa thớt. Một mục chỉ mục sẽ được thêm cho một tài liệu bất kể tài liệu đó có chứa bất kỳ trường nào được chỉ định trong chỉ mục hay không. Các trường không tồn tại được coi là có giá trị NULL khi tạo các mục chỉ mục. Để thay đổi hành vi này, bạn có thể xác định chỉ mục là chỉ mục thưa thớt.
Chỉ mục thưa thớt
Chỉ mục thưa thớt chỉ lập chỉ mục cho các tài liệu trong bộ sưu tập có chứa giá trị (bao gồm cả giá trị rỗng) cho ít nhất một trong các trường được lập chỉ mục. Chỉ mục thưa thớt giúp giảm chi phí lưu trữ và có thể cải thiện hiệu suất.
Chỉ mục nhiều khoá cho các giá trị mảng
Nếu đang tạo chỉ mục trên một trường chứa các giá trị mảng, bạn phải tạo chỉ mục nhiều khoá. Chỉ mục thông thường không thể lập chỉ mục cho các giá trị mảng. Chỉ mục nhiều khoá hỗ trợ tối đa một trường mảng trong định nghĩa chỉ mục và có thể dùng cho các thao tác duyệt qua các giá trị mảng.
Chỉ sử dụng chỉ mục nhiều khoá nếu bạn biết rằng mình cần lập chỉ mục cho các giá trị mảng. Chỉ mục thông thường có lợi thế khi xử lý một truy vấn. Ví dụ: chỉ mục thông thường có thể lọc các giá trị trong một phạm vi hiệu quả hơn.
Các trường hợp sau đây dẫn đến lỗi khi làm việc với các giá trị mảng và chỉ mục nhiều khoá:
- Một thao tác cố gắng thêm giá trị mảng vào một trường được lập chỉ mục bằng chỉ mục thông thường. Để thêm giá trị mảng, bạn phải xoá các chỉ mục thông thường hiện có trên trường đó và tạo lại các chỉ mục đó dưới dạng chỉ mục nhiều khoá.
- Bạn cố gắng tạo chỉ mục thông thường trên một trường chứa giá trị mảng. Bạn phải tạo chỉ mục nhiều khoá hoặc xoá các giá trị mảng.
- Một thao tác cố gắng lập chỉ mục cho nhiều trường có giá trị mảng. Bạn không thể có nhiều hơn một trường có giá trị mảng trong chỉ mục nhiều khoá. Để tiếp tục, hãy sửa đổi mô hình dữ liệu hoặc định nghĩa chỉ mục.
- Bạn cố gắng tạo chỉ mục nhiều khoá trong đó 2 đường dẫn trường dùng chung một tiền tố chung như
users.postsvàusers.zip.
Chỉ mục duy nhất
Đặt tuỳ chọn chỉ mục duy nhất để thực thi các giá trị duy nhất cho các trường được lập chỉ mục. Đối với các chỉ mục trên nhiều trường, mỗi tổ hợp giá trị phải là duy nhất trong chỉ mục. Cơ sở dữ liệu từ chối mọi thao tác cập nhật và chèn cố gắng tạo các mục chỉ mục có giá trị trùng lặp. Nếu dữ liệu của các trường được lập chỉ mục chứa các giá trị trùng lặp và bạn cố gắng tạo chỉ mục duy nhất, thì quá trình tạo chỉ mục sẽ không thành công và thông báo lỗi sẽ xuất hiện trong phần chi tiết thao tác.
Các trường không có trong chỉ mục duy nhất
Nếu bạn chèn một tài liệu có các trường bị thiếu cho chỉ mục duy nhất, thì chỉ mục sẽ đặt giá trị null cho các trường bị thiếu. Mục chỉ mục kết quả phải là duy nhất, nếu không thao tác sẽ không thành công.
Ví dụ: với chỉ mục này:
db.cities.createIndex( { "name": 1 }, { unique: true } )
Nếu bạn thêm tài liệu {"abbreviation": "LA"} vào bộ sưu tập, thì chỉ mục duy nhất
sẽ tạo một mục có name được đặt thành null. Nếu sau đó bạn cố gắng thêm
tài liệu {"abbreviation": "NYC"}, thì thao tác sẽ không thành công vì mục kết quả cho chỉ mục duy nhất là giống nhau.
Hành vi tương tự cũng áp dụng cho các chỉ mục duy nhất có nhiều trường.
Khi tạo hoặc cập nhật tài liệu, các trường được lập chỉ mục bị thiếu sẽ được đặt thành null và mục chỉ mục kết quả phải là duy nhất trong chỉ mục.
Chỉ mục TTL
Sử dụng chỉ mục TTL để tự động xoá dữ liệu cũ khỏi cơ sở dữ liệu. Chỉ mục TTL chỉ định một trường nhất định làm thời gian hết hạn cho các tài liệu trong một bộ sưu tập nhất định. Với TTL, bạn có thể giảm chi phí lưu trữ bằng cách dọn sạch dữ liệu lỗi thời. Dữ liệu thường bị xoá trong vòng 24 giờ sau thời gian hết hạn.
Khắc phục lỗi tạo chỉ mục
Bạn có thể gặp lỗi tạo chỉ mục khi quản lý chỉ mục. Thao tác lập chỉ mục có thể không thành công nếu cơ sở dữ liệu gặp vấn đề với dữ liệu. Thao tác lập chỉ mục có thể không thành công vì những lý do sau:
- Bạn đã đạt đến giới hạn chỉ mục. Ví dụ: thao tác có thể đã đạt đến số lượng mục chỉ mục tối đa cho mỗi tài liệu. Nếu quá trình tạo chỉ mục không thành công, bạn sẽ thấy thông báo lỗi. Nếu bạn chưa đạt đến giới hạn chỉ mục, hãy thử lại thao tác chỉ mục.
- Bạn phải có chỉ mục nhiều khoá. Ít nhất một trong các trường được lập chỉ mục chứa giá trị mảng. Để tiếp tục, bạn phải sử dụng chỉ mục nhiều khoá hoặc xoá các giá trị mảng.
- Một thao tác cố gắng lập chỉ mục cho nhiều trường có giá trị mảng. Bạn không thể có nhiều hơn một trường có giá trị mảng trong chỉ mục nhiều khoá. Để tiếp tục, hãy sửa đổi mô hình dữ liệu hoặc định nghĩa chỉ mục.
- Bạn đặt tuỳ chọn chỉ mục duy nhất và dữ liệu của các trường được lập chỉ mục sẽ tạo các mục chỉ mục trùng lặp. Để tiếp tục, hãy xoá các tổ hợp giá trị trùng lặp khỏi dữ liệu.
Bước tiếp theo
- Tìm hiểu cách tạo và quản lý chỉ mục hoặc chỉ mục TTL