Chỉ mục là một yếu tố quan trọng trong hiệu suất của cơ sở dữ liệu. Tương tự như chỉ mục của một cuốn sách liên kết các chủ đề trong sách với số trang, chỉ mục cơ sở dữ liệu liên kết các mục trong cơ sở dữ liệu với vị trí của chúng trong cơ sở dữ liệu. Khi bạn truy vấn một cơ sở dữ liệu, cơ sở dữ liệu đó có thể sử dụng chỉ mục để nhanh chóng xác định vị trí của các mục mà bạn yêu cầu.
Trang này mô tả hai loại chỉ mục mà Cloud Firestore sử dụng, đó là chỉ mục tự động và chỉ mục thủ công.
Định nghĩa và cấu trúc chỉ mục
Chỉ mục được xác định trên danh sách các trường của một tài liệu nhất định, với chế độ chỉ mục tương ứng cho mỗi trường.
Chỉ mục chứa một mục nhập cho mỗi trường có tên trong định nghĩa chỉ mục. Chỉ mục bao gồm tất cả tài liệu có thể là kết quả cho các truy vấn dựa trên chỉ mục. Một tài liệu chỉ được đưa vào chỉ mục nếu tài liệu đó có một giá trị được lập chỉ mục được đặt cho mọi trường được dùng trong chỉ mục. Nếu định nghĩa chỉ mục tham chiếu đến một trường mà tài liệu không có giá trị nào được đặt, thì tài liệu đó sẽ không xuất hiện trong chỉ mục. Trong trường hợp này, tài liệu sẽ không bao giờ được trả về dưới dạng kết quả cho bất kỳ truy vấn nào dựa trên chỉ mục.
Chỉ mục được sắp xếp theo giá trị trường, theo thứ tự được chỉ định trong định nghĩa chỉ mục.
Chỉ mục đằng sau mỗi cụm từ tìm kiếm
Nếu không có chỉ mục nào cho một truy vấn, thì hầu hết các cơ sở dữ liệu sẽ thu thập thông tin qua từng mục nội dung, một quy trình chậm và thậm chí còn chậm hơn khi cơ sở dữ liệu phát triển. Cloud Firestore giúp mang lại hiệu suất truy vấn cao bằng cách sử dụng chỉ mục cho tất cả truy vấn. Do đó, hiệu suất truy vấn phụ thuộc vào kích thước của tập kết quả chứ không phụ thuộc vào số lượng mục trong cơ sở dữ liệu.
Ít quản lý chỉ mục hơn, phát triển ứng dụng nhiều hơn
Cloud Firestore có các tính năng giúp giảm thời gian bạn cần dành cho việc quản lý chỉ mục. Các chỉ mục cần thiết cho những truy vấn cơ bản nhất sẽ được tạo tự động cho bạn. Khi bạn sử dụng và kiểm thử ứng dụng, Cloud Firestore sẽ giúp bạn xác định và tạo thêm các chỉ mục mà ứng dụng của bạn yêu cầu.
Loại chỉ mục
Cloud Firestore sử dụng hai loại chỉ mục: tự động và thủ công. Chỉ mục thủ công và chỉ mục tự động khác nhau ở cách bạn quản lý chúng.
Chỉ mục tự động
Theo mặc định, Cloud Firestore sẽ tự động tạo chỉ mục cho từng trường có trong tài liệu của một tập hợp. Các chỉ mục trường đơn này cho phép bạn thực hiện nhiều truy vấn cơ bản. Bạn quản lý chỉ mục tự động bằng cách định cấu hình chế độ cài đặt lập chỉ mục tự động và các trường hợp miễn lập chỉ mục của cơ sở dữ liệu.
Chế độ mặc định của chỉ mục tự động
Cloud Firestore sử dụng các chế độ cài đặt mặc định sau đây cho chỉ mục tự động:
Đối với mỗi trường không phải mảng và không phải bản đồ, Cloud Firestore sẽ xác định hai chỉ mục phạm vi tập hợp, một chỉ mục ở chế độ tăng dần và một chỉ mục ở chế độ giảm dần.
Đối với mỗi trường bản đồ, Cloud Firestore sẽ tạo những nội dung sau:
- Một chỉ mục tăng dần trong phạm vi tập hợp cho mỗi trường con không phải mảng, không phải bản đồ.
- Một chỉ mục giảm dần trong phạm vi tập hợp cho mỗi trường con không phải mảng, không phải bản đồ.
- Một chỉ mục tăng dần trong phạm vi tập hợp cho toàn bộ giá trị bản đồ
- Một chỉ mục giảm dần trong phạm vi tập hợp cho toàn bộ giá trị bản đồ
- Một chỉ mục array-contains trong phạm vi tập hợp cho mỗi trường con của mảng.
- Cloud Firestore lập chỉ mục đệ quy cho từng trường con của bản đồ.
Đối với mỗi trường mảng trong một tài liệu, Cloud Firestore sẽ tạo những mục sau:
- Một chỉ mục tăng dần trong phạm vi tập hợp cho toàn bộ giá trị mảng
- Một chỉ mục giảm dần trong phạm vi tập hợp cho toàn bộ giá trị mảng
- Một chỉ mục array-contains trong phạm vi tập hợp.
Theo mặc định, các chỉ mục tự động có phạm vi nhóm tập hợp sẽ không được duy trì.
Miễn trừ lập chỉ mục tự động
Bạn có thể miễn trừ một trường khỏi chế độ cài đặt lập chỉ mục tự động bằng cách tạo một trường hợp miễn trừ lập chỉ mục. Trường hợp miễn lập chỉ mục sẽ ghi đè chế độ cài đặt chỉ mục tự động trên toàn cơ sở dữ liệu. Trường hợp miễn trừ có thể bật một chỉ mục mà chế độ cài đặt lập chỉ mục tự động của bạn sẽ tắt hoặc tắt một chỉ mục mà chế độ lập chỉ mục tự động sẽ bật. Để biết các trường hợp có thể áp dụng quy tắc miễn trừ, hãy xem các phương pháp hay nhất về việc lập chỉ mục.
Sử dụng giá trị đường dẫn trường * để thêm các trường hợp miễn trừ chỉ mục ở cấp tập hợp trên tất cả các trường trong một nhóm tập hợp. Ví dụ: đối với nhóm tập hợp comments, hãy đặt đường dẫn trường thành * để khớp với tất cả các trường trong nhóm tập hợp comments và tắt tính năng lập chỉ mục tất cả các trường trong nhóm tập hợp. Sau đó, bạn có thể thêm
các trường hợp miễn trừ để chỉ lập chỉ mục các trường cần thiết cho truy vấn của mình. Việc giảm số lượng trường được lập chỉ mục sẽ giúp giảm chi phí lưu trữ và có thể cải thiện hiệu suất ghi.
Nếu bạn tạo một trường hợp miễn trừ chỉ mục cho một trường bản đồ, thì các trường con của bản đồ sẽ kế thừa các chế độ cài đặt đó. Tuy nhiên, bạn có thể xác định các trường hợp miễn lập chỉ mục cho các trường con cụ thể. Nếu bạn xoá một trường hợp miễn trừ cho một trường phụ, thì trường phụ đó sẽ kế thừa chế độ cài đặt miễn trừ của trường mẹ (nếu có) hoặc chế độ cài đặt trên toàn cơ sở dữ liệu nếu không có trường hợp miễn trừ nào của trường mẹ.
Để tạo và quản lý các trường hợp miễn trừ chỉ mục tự động, hãy xem phần Quản lý chỉ mục.
Chỉ mục thủ công
Chỉ mục thủ công lưu trữ mối liên kết được sắp xếp của tất cả tài liệu trong một tập hợp, dựa trên danh sách theo thứ tự của các trường để lập chỉ mục.
Cloud Firestore sử dụng chỉ mục thủ công để hỗ trợ các truy vấn chưa được chỉ mục tự động hỗ trợ.
Theo mặc định, Cloud Firestore sẽ tự động tạo chỉ mục trường đơn cho mỗi trường có trong một tập hợp. Cloud Firestore không tự động tạo chỉ mục cho các tổ hợp trường vì có quá nhiều tổ hợp trường có thể xảy ra. Thay vào đó, Cloud Firestore giúp bạn xác định và tạo các chỉ mục bắt buộc khi bạn xây dựng ứng dụng.
Bất cứ khi nào bạn cố gắng thực hiện một truy vấn không được chỉ mục hiện có hỗ trợ, Cloud Firestore sẽ trả về một thông báo lỗi kèm theo đường liên kết mà bạn có thể nhấp vào để tạo chỉ mục bị thiếu.
Bạn cũng có thể xác định và quản lý chỉ mục theo cách thủ công bằng cách sử dụng bảng điều khiển hoặc Giao diện dòng lệnh (CLI) của Firebase. Để biết thêm thông tin về cách tạo và quản lý chỉ mục thủ công, hãy xem bài viết Quản lý chỉ mục.
Chế độ chỉ mục và phạm vi truy vấn
Bạn định cấu hình chỉ mục tự động và thủ công theo cách khác nhau, nhưng cả hai đều yêu cầu bạn định cấu hình chế độ chỉ mục và phạm vi truy vấn cho chỉ mục của mình.
Chế độ chỉ mục
Khi xác định một chỉ mục, bạn sẽ chọn một chế độ chỉ mục cho mỗi trường được lập chỉ mục. Mỗi chế độ chỉ mục của trường hỗ trợ các mệnh đề truy vấn cụ thể trên trường đó. Bạn có thể chọn trong số các chế độ lập chỉ mục sau:
| Chế độ chỉ mục | Mô tả |
|---|---|
| Tăng dần | Hỗ trợ các mệnh đề truy vấn <, <=, ==, >=, >, !=, in và not-in trên trường này, đồng thời hỗ trợ sắp xếp kết quả theo thứ tự tăng dần dựa trên giá trị của trường này. |
| Giảm dần | Hỗ trợ các mệnh đề truy vấn <, <=, ==, >=, >, !=, in và not-in trên trường này, đồng thời hỗ trợ sắp xếp kết quả theo thứ tự giảm dần dựa trên giá trị của trường này. |
| Array‑contains | Hỗ trợ các mệnh đề truy vấn array-contains và array-contains-any trên trường. |
| Vector | Hỗ trợ các mệnh đề truy vấn FindNearest trên trường. |
Phạm vi truy vấn
Mỗi chỉ mục được đặt trong phạm vi của một tập hợp hoặc một nhóm tập hợp. Đây được gọi là phạm vi truy vấn của chỉ mục:
- Phạm vi thu thập Theo mặc định,
- Cloud Firestore sẽ tạo chỉ mục có phạm vi tập hợp. Các chỉ mục này hỗ trợ những truy vấn trả về kết quả từ một tập hợp duy nhất.
- Phạm vi nhóm bộ sưu tập
- Một nhóm tập hợp bao gồm tất cả các tập hợp có cùng mã nhận dạng tập hợp. Để chạy một truy vấn nhóm tập hợp trả về kết quả được lọc hoặc sắp xếp theo thứ tự từ một nhóm tập hợp, bạn phải tạo một chỉ mục tương ứng với phạm vi nhóm tập hợp.
Thứ tự mặc định và trường __name__
Ngoài việc sắp xếp tài liệu theo chế độ chỉ mục được chỉ định cho từng trường (tăng dần hoặc giảm dần) , chỉ mục còn áp dụng cách sắp xếp cuối cùng theo trường __name__ của mỗi tài liệu. Giá trị của trường __name__ được đặt thành đường dẫn đầy đủ của tài liệu. Điều này có nghĩa là các tài liệu
trong nhóm kết quả có cùng giá trị trường sẽ được sắp xếp theo đường dẫn tài liệu.
Theo mặc định, trường __name__ được sắp xếp theo cùng hướng với trường được sắp xếp gần đây nhất trong định nghĩa chỉ mục. Ví dụ:
| Thu thập | Số trường được lập chỉ mục | Phạm vi truy vấn |
|---|---|---|
| thành phố | name, __name__ |
Thu thập |
| thành phố | tiểu bang, __name__ |
Thu thập |
| thành phố | quốc gia, dân số, __name__ |
Thu thập |
Để sắp xếp kết quả theo hướng __name__ không mặc định, bạn cần tạo chỉ mục đó.
Thuộc tính chỉ mục
Chỉ mục cho phép thực thi truy vấn hiệu quả nhất được xác định bằng các thuộc tính sau:
- Các trường được dùng trong bộ lọc bằng
- Các trường được dùng trong thứ tự sắp xếp
- Các trường được dùng trong bộ lọc dải ô và bất đẳng thức (chưa có trong thứ tự sắp xếp)
- Các trường được dùng trong dữ liệu tổng hợp (chưa được đưa vào thứ tự sắp xếp, bộ lọc phạm vi và bộ lọc bất đẳng thức)
Cloud Firestore tính toán kết quả cho các truy vấn như sau:
- Xác định chỉ mục tương ứng với tập hợp, thuộc tính bộ lọc, toán tử bộ lọc và thứ tự sắp xếp của truy vấn.
- Xác định vị trí chỉ mục mà quá trình quét bắt đầu. Vị trí bắt đầu có tiền tố là bộ lọc bằng của truy vấn và kết thúc bằng bộ lọc dải ô và bất đẳng thức trên trường
orderByđầu tiên. - Bắt đầu quét chỉ mục, trả về từng tài liệu đáp ứng tất cả các bộ lọc, cho đến khi quá trình quét thực hiện một trong những thao tác sau:
- Gặp một tài liệu không đáp ứng các điều kiện lọc và xác nhận rằng mọi tài liệu tiếp theo sẽ không bao giờ đáp ứng đầy đủ các điều kiện lọc.
- Đến cuối chỉ mục.
- Thu thập số lượng kết quả tối đa mà truy vấn yêu cầu.
Ví dụ về việc lập chỉ mục
Bằng cách tự động tạo chỉ mục một trường cho bạn, Cloud Firestore cho phép ứng dụng của bạn nhanh chóng hỗ trợ các truy vấn cơ sở dữ liệu cơ bản nhất.
Chỉ mục trường đơn cho phép bạn thực hiện các truy vấn đơn giản dựa trên giá trị trường và các toán tử so sánh <, <=, ==, >=, > và in. Đối với các trường mảng, các chỉ mục này cho phép bạn thực hiện truy vấn array-contains và array-contains-any.
Để minh hoạ, hãy xem xét các ví dụ sau đây theo quan điểm tạo chỉ mục. Đoạn mã sau đây tạo một vài tài liệu city trong tập hợp cities và đặt các trường name, state, country, capital, population và regions cho mỗi tài liệu:
Web
var citiesRef = db.collection("cities"); citiesRef.doc("SF").set({ name: "San Francisco", state: "CA", country: "USA", capital: false, population: 860000, regions: ["west_coast", "norcal"] }); citiesRef.doc("LA").set({ name: "Los Angeles", state: "CA", country: "USA", capital: false, population: 3900000, regions: ["west_coast", "socal"] }); citiesRef.doc("DC").set({ name: "Washington, D.C.", state: null, country: "USA", capital: true, population: 680000, regions: ["east_coast"] }); citiesRef.doc("TOK").set({ name: "Tokyo", state: null, country: "Japan", capital: true, population: 9000000, regions: ["kanto", "honshu"] }); citiesRef.doc("BJ").set({ name: "Beijing", state: null, country: "China", capital: true, population: 21500000, regions: ["jingjinji", "hebei"] });
Giả sử chế độ cài đặt lập chỉ mục tự động mặc định, Cloud Firestore sẽ cập nhật một chỉ mục trường đơn tăng dần cho mỗi trường, một chỉ mục trường đơn giảm dần cho mỗi trường và một chỉ mục trường đơn chứa mảng cho trường mảng. Mỗi hàng trong bảng sau đây đại diện cho một mục nhập trong chỉ mục trường đơn:
| Thu thập | Đã lập chỉ mục trường | Phạm vi truy vấn |
|---|---|---|
| thành phố | Tên | Thu thập |
| thành phố | bang | Thu thập |
| thành phố | quốc gia | Thu thập |
| thành phố | hoa | Thu thập |
| thành phố | dân số | Thu thập |
| thành phố | vùng | Thu thập |
| thành phố | Tên | Thu thập |
| thành phố | bang | Thu thập |
| thành phố | quốc gia | Thu thập |
| thành phố | hoa | Thu thập |
| thành phố | dân số | Thu thập |
| thành phố | vùng | Thu thập |
| thành phố | array-contains vùng |
Thu thập |
Các truy vấn được chỉ mục một trường hỗ trợ
Khi sử dụng các chỉ mục một trường được tạo tự động này, bạn có thể chạy các truy vấn đơn giản như sau:
Web
const stateQuery = citiesRef.where("state", "==", "CA"); const populationQuery = citiesRef.where("population", "<", 100000); const nameQuery = citiesRef.where("name", ">=", "San Francisco");
Bạn cũng có thể tạo truy vấn in và truy vấn bằng nhau phức hợp (==):
Web
citiesRef.where('country', 'in', ["USA", "Japan", "China"])
// Compound equality queries
citiesRef.where("state", "==", "CO").where("name", "==", "Denver")
citiesRef.where("country", "==", "USA")
.where("capital", "==", false)
.where("state", "==", "CA")
.where("population", "==", 860000)Nếu cần chạy một truy vấn phức hợp sử dụng phép so sánh phạm vi (<, <=, > hoặc >=) hoặc nếu cần sắp xếp theo một trường khác, bạn phải tạo một chỉ mục thủ công cho truy vấn đó.
Chỉ mục array-contains cho phép bạn truy vấn trường mảng regions:
Web
citiesRef.where("regions", "array-contains", "west_coast") // array-contains-any and array-contains use the same indexes citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"])
Các truy vấn được hỗ trợ bởi chỉ mục thủ công
Tạo chỉ mục thủ công để hỗ trợ các truy vấn phức hợp chưa được chỉ mục trường đơn tự động hỗ trợ. Ví dụ: bạn cần có chỉ mục thủ công cho các truy vấn sau:
Web
citiesRef.where("country", "==", "USA").orderBy("population", "asc")
citiesRef.where("country", "==", "USA").where("population", "<", 3800000)
citiesRef.where("country", "==", "USA").where("population", ">", 690000)
// in and == clauses use the same index
citiesRef.where("country", "in", ["USA", "Japan", "China"])
.where("population", ">", 690000)Các truy vấn này yêu cầu chỉ mục sau. Vì truy vấn sử dụng
phép so sánh bằng (== hoặc in) cho trường country, nên bạn có thể sử dụng
chế độ chỉ mục tăng dần hoặc giảm dần cho trường này. Theo mặc định,
mệnh đề bất đẳng thức áp dụng thứ tự sắp xếp tăng dần dựa trên trường trong
mệnh đề bất đẳng thức.
| Thu thập | Số trường được lập chỉ mục | Phạm vi truy vấn |
|---|---|---|
| thành phố | (hoặc ) quốc gia, dân số | Thu thập |
Để chạy cùng một truy vấn nhưng theo thứ tự sắp xếp giảm dần, bạn cần có thêm một chỉ mục theo hướng giảm dần cho population:
Web
citiesRef.where("country", "==", "USA").orderBy("population", "desc")
citiesRef.where("country", "==", "USA")
.where("population", "<", 3800000)
.orderBy("population", "desc")
citiesRef.where("country", "==", "USA")
.where("population", ">", 690000)
.orderBy("population", "desc")
citiesRef.where("country", "in", ["USA", "Japan", "China"])
.where("population", ">", 690000)
.orderBy("population", "desc")| Thu thập | Số trường được lập chỉ mục | Phạm vi truy vấn |
|---|---|---|
| thành phố | quốc gia, dân số | Thu thập |
| thành phố | quốc gia, dân số | Thu thập |
Để tránh mất hiệu suất do hợp nhất chỉ mục, bạn nên tạo một chỉ mục để kết hợp truy vấn array-contains hoặc array-contains-any với các mệnh đề bổ sung:
Web
citiesRef.where("regions", "array-contains", "east_coast") .where("capital", "==", true) // array-contains-any and array-contains use the same index citiesRef.where("regions", "array-contains-any", ["west_coast", "east_coast"]) .where("capital", "==", true)
| Thu thập | Số trường được lập chỉ mục | Phạm vi truy vấn |
|---|---|---|
| thành phố | Thẻ array-contains, thủ đô (hoặc ) | Thu thập |
Các truy vấn được hỗ trợ bởi chỉ mục nhóm tập hợp
Để minh hoạ một chỉ mục có phạm vi nhóm tập hợp, hãy thêm một tập hợp con landmarks vào một số tài liệu city:
Web
var citiesRef = db.collection("cities"); citiesRef.doc("SF").collection("landmarks").doc().set({ name: "Golden Gate Bridge", category : "bridge" }); citiesRef.doc("SF").collection("landmarks").doc().set({ name: "Golden Gate Park", category : "park" }); citiesRef.doc("DC").collection("landmarks").doc().set({ name: "National Gallery of Art", category : "museum" }); citiesRef.doc("DC").collection("landmarks").doc().set({ name: "National Mall", category : "park" });
Khi sử dụng chỉ mục trường đơn sau đây với phạm vi tập hợp, bạn có thể truy vấn tập hợp landmarks của một thành phố dựa trên trường category:
| Thu thập | Số trường được lập chỉ mục | Phạm vi truy vấn |
|---|---|---|
| địa danh | Danh mục (hoặc ) | Thu thập |
Web
citiesRef.doc("SF").collection("landmarks").where("category", "==", "park")
citiesRef.doc("SF").collection("landmarks").where("category", "in", ["park", "museum"])Ví dụ: nếu muốn truy vấn các địa danh trên tất cả thành phố, bạn sẽ chạy truy vấn này trên nhóm tập hợp bao gồm tất cả tập hợp landmarks. Bạn cũng phải bật một landmarks chỉ mục trường đơn có phạm vi nhóm tập hợp:
| Thu thập | Số trường được lập chỉ mục | Phạm vi truy vấn |
|---|---|---|
| địa danh | Danh mục (hoặc ) | Nhóm bộ sưu tập |
Khi bật chỉ mục này, bạn có thể truy vấn nhóm tập hợp landmarks:
Web
var landmarksGroupRef = db.collectionGroup("landmarks"); landmarksGroupRef.where("category", "==", "park") landmarksGroupRef.where("category", "in", ["park", "museum"])
Để chạy một truy vấn nhóm tập hợp trả về kết quả được lọc hoặc sắp xếp, bạn phải bật một chỉ mục tương ứng với phạm vi nhóm tập hợp. Tuy nhiên, các truy vấn nhóm tập hợp không lọc hoặc sắp xếp kết quả không yêu cầu bất kỳ định nghĩa chỉ mục bổ sung nào.
Ví dụ: bạn có thể chạy truy vấn nhóm tập hợp sau đây mà không cần bật chỉ mục bổ sung:
Web
db.collectionGroup("landmarks").get()Mục nhập chỉ mục
Chỉ mục đã định cấu hình của dự án và cấu trúc của tài liệu sẽ xác định số lượng mục nhập chỉ mục cho một tài liệu. Mục nhập chỉ mục được tính vào giới hạn số lượng mục nhập chỉ mục.
Ví dụ sau đây minh hoạ các mục nhập chỉ mục của một tài liệu.
Tài liệu
/cities/SF
city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]
Chỉ mục tự động
- city_name ASC
- city_name DESC
- khu vực lân cận ASC
- neighborhoods DESC
- nhiệt độ ASC
- temperatures DESC
- temperatures.summer ASC
- temperatures.summer DESC
- temperatures.winter ASC
- temperatures.winter DESC
- neighborhoods Array Contains
Chỉ mục thủ công
- city_name ASC, neighborhoods ARRAY
- city_name DESC, neighborhoods ARRAY
Mục nhập chỉ mục
Cấu hình lập chỉ mục này dẫn đến các mục nhập chỉ mục sau đây cho tài liệu:
| Chỉ mục | Dữ liệu được lập chỉ mục |
|---|---|
| Mục nhập chỉ mục tự động | |
| city_name ASC | city_name: "San Francisco" |
| city_name DESC | city_name: "San Francisco" |
| khu vực lân cận ASC | neighborhoods: ["Mission", "Downtown", "Marina"] |
| neighborhoods DESC | neighborhoods: ["Mission", "Downtown", "Marina"] |
| nhiệt độ ASC | temperatures: {summer: 67, winter: 55} |
| temperatures DESC | temperatures: {summer: 67, winter: 55} |
| temperatures.summer ASC | temperatures.summer: 67 |
| temperatures.summer DESC | temperatures.summer: 67 |
| temperatures.winter ASC | temperatures.winter: 55 |
| temperatures.winter DESC | temperatures.winter: 55 |
| neighborhoods Array Contains | khu lân cận: "Mission" |
| neighborhoods Array Contains | neighborhoods: "Downtown" |
| neighborhoods Array Contains | khu lân cận: "Marina" |
| Mục nhập chỉ mục thủ công | |
| city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Mission" |
| city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Downtown" |
| city_name ASC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
| city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Mission" |
| city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Downtown" |
| city_name DESC, neighborhoods ARRAY | city_name: "San Francisco", neighborhoods: "Marina" |
Chỉ số và giá
Chỉ mục góp phần vào chi phí lưu trữ của ứng dụng. Để biết thêm thông tin về cách tính kích thước bộ nhớ cho chỉ mục, hãy xem phần Kích thước mục nhập chỉ mục.
Sử dụng tính năng hợp nhất chỉ mục
Mặc dù Cloud Firestore sử dụng một chỉ mục cho mỗi truy vấn, nhưng không nhất thiết phải có một chỉ mục cho mỗi truy vấn. Đối với các truy vấn có nhiều mệnh đề bằng nhau (==) và mệnh đề orderBy (không bắt buộc), Cloud Firestore có thể sử dụng lại các chỉ mục hiện có. Cloud Firestore có thể hợp nhất các chỉ mục cho bộ lọc bằng đơn giản để tạo các chỉ mục cần thiết cho truy vấn bằng lớn hơn.
Bạn có thể giảm chi phí lập chỉ mục bằng cách xác định những trường hợp có thể sử dụng tính năng hợp nhất chỉ mục. Ví dụ: trong một tập hợp restaurants cho ứng dụng xếp hạng nhà hàng:
nhà hàng
burgerthyme
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
Ứng dụng này sử dụng các truy vấn như sau. Ứng dụng sử dụng kết hợp các mệnh đề bằng nhau cho category, city và editors_pick trong khi luôn sắp xếp theo thứ tự tăng dần star_rating:
Web
db.collection("restaurants").where("category", "==", "burgers")
.orderBy("star_rating")
db.collection("restaurants").where("city", "==", "San Francisco")
.orderBy("star_rating")
db.collection("restaurants").where("category", "==", "burgers")
.where("city", "==", "San Francisco")
.orderBy("star_rating")
db.collection("restaurants").where("category", "==", "burgers")
.where("city", "==", "San Francisco")
.where("editors_pick", "==", true )
.orderBy("star_rating")Bạn có thể tạo một chỉ mục cho mỗi truy vấn:
| Thu thập | Số trường được lập chỉ mục | Phạm vi truy vấn |
|---|---|---|
| nhà hàng | category, star_rating | Thu thập |
| nhà hàng | city, star_rating | Thu thập |
| nhà hàng | category, city, star_rating | Thu thập |
| nhà hàng | category, city, editors_pick, star_rating | Thu thập |
Một giải pháp tốt hơn là bạn có thể giảm số lượng chỉ mục bằng cách tận dụng khả năng hợp nhất chỉ mục của Cloud Firestore cho các mệnh đề bằng nhau:
| Thu thập | Số trường được lập chỉ mục | Phạm vi truy vấn |
|---|---|---|
| nhà hàng | category, star_rating | Thu thập |
| nhà hàng | city, star_rating | Thu thập |
| nhà hàng | editors_pick, star_rating | Thu thập |
Tập hợp chỉ mục này không chỉ nhỏ hơn mà còn hỗ trợ thêm một truy vấn:
Web
db.collection("restaurants").where("editors_pick", "==", true)
.orderBy("star_rating")Giới hạn lập chỉ mục
Các giới hạn sau áp dụng cho chỉ mục. Để biết thêm thông tin về hạn mức và giới hạn, hãy xem phần Hạn mức và giới hạn.
| Giới hạn | Thông tin chi tiết |
|---|---|
| Số lượng chỉ mục kết hợp tối đa cho một cơ sở dữ liệu |
|
| Số lượng cấu hình trường đơn tối đa cho một cơ sở dữ liệu |
Một cấu hình cấp trường có thể chứa nhiều cấu hình cho cùng một trường. Ví dụ: một trường hợp miễn lập chỉ mục cho một trường và một chính sách TTL trên cùng một trường được tính là một cấu hình trường trong hạn mức. |
|
Số mục nhập chỉ mục tối đa cho mỗi tài liệu |
40.000 Số lượng mục nhập chỉ mục là tổng của các mục sau đây cho một tài liệu:
Để xem cách Cloud Firestore biến một tài liệu và một tập hợp chỉ mục thành các mục chỉ mục, hãy xem ví dụ về số lượng mục chỉ mục này. |
| Số trường tối đa trong một chỉ mục kết hợp | 100 |
| Kích thước tối đa của một mục nhập chỉ mục |
7,5 KiB Để xem cách Cloud Firestore tính toán kích thước mục nhập chỉ mục, hãy xem phần kích thước mục nhập chỉ mục. |
| Tổng kích thước tối đa của các mục nhập chỉ mục của một tài liệu |
8 MiB Tổng kích thước là tổng của các giá trị sau đây cho một tài liệu: |
| Kích thước tối đa của giá trị trường được lập chỉ mục |
1500 byte Giá trị trường vượt quá 1.500 byte sẽ bị cắt bớt. Các truy vấn liên quan đến giá trị trường bị cắt bớt có thể trả về kết quả không nhất quán. |
Các phương pháp hay nhất về việc lập chỉ mục
Đối với hầu hết các ứng dụng, bạn có thể dựa vào tính năng lập chỉ mục tự động và các đường liên kết đến thông báo lỗi để quản lý chỉ mục của mình. Tuy nhiên, bạn nên thêm các trường hợp miễn lập chỉ mục tự động trong những trường hợp sau:
| Cách | Mô tả |
|---|---|
| Trường chuỗi lớn | Nếu có một trường chuỗi thường chứa các giá trị chuỗi dài mà bạn không dùng để truy vấn, thì bạn có thể giảm chi phí lưu trữ bằng cách miễn lập chỉ mục cho trường đó. |
| Tỷ lệ ghi cao vào một tập hợp chứa các tài liệu có giá trị tuần tự | Nếu bạn lập chỉ mục một trường tăng hoặc giảm tuần tự giữa các tài liệu trong một tập hợp (chẳng hạn như dấu thời gian), thì tốc độ ghi tối đa vào tập hợp đó là 500 lượt ghi mỗi giây. Nếu không truy vấn dựa trên trường có giá trị tuần tự, bạn có thể miễn lập chỉ mục cho trường đó để bỏ qua giới hạn này. Ví dụ: trong trường hợp sử dụng IoT có tốc độ ghi cao, một tập hợp chứa các tài liệu có trường dấu thời gian có thể đạt đến giới hạn 500 lượt ghi mỗi giây. |
| Trường TTL |
Nếu bạn sử dụng chính sách TTL (thời gian tồn tại), hãy lưu ý rằng trường TTL phải là dấu thời gian. Tính năng lập chỉ mục trên các trường TTL được bật theo mặc định và có thể ảnh hưởng đến hiệu suất khi lưu lượng truy cập cao hơn. Phương pháp hay nhất là thêm các trường hợp miễn lập chỉ mục tự động cho các trường TTL. |
| Các trường mảng hoặc bản đồ lớn | Các trường mảng hoặc bản đồ lớn có thể đạt đến giới hạn 40.000 mục nhập chỉ mục cho mỗi tài liệu. Nếu không truy vấn dựa trên một trường mảng hoặc bản đồ lớn, bạn nên miễn lập chỉ mục cho trường đó. |
Nếu bạn đang sử dụng truy vấn có toán tử phạm vi và bất đẳng thức trên nhiều trường, hãy xem các điểm cần lưu ý khi lập chỉ mục để tối ưu hoá hiệu suất và chi phí của truy vấn Cloud Firestore.
Để biết thêm thông tin về cách giải quyết các vấn đề liên quan đến việc lập chỉ mục (phân phối chỉ mục, lỗi INVALID_ARGUMENT), hãy xem trang khắc phục sự cố.