Chỉ mục là một yếu tố quan trọng ảnh hưởng đến hiệu suất của cơ sở dữ liệu. Giống như chỉ mục của một cuốn sách liên kết các chủ đề trong một cuốn sách với số trang, chỉ mục cơ sở dữ liệu sẽ ánh xạ các mục trong cơ sở dữ liệu với vị trí của các mục đó trong cơ sở dữ liệu. Khi bạn gửi một truy vấn cơ sở dữ liệu, cơ sở dữ liệu có thể sử dụng một chỉ mục để nhanh chóng tra cứu vị trí của các mục bạn đã yêu cầu.
Trang này mô tả 2 loại chỉ mục mà Cloud Firestore sử dụng: chỉ mục một trường và chỉ mục tổng hợp.
Định nghĩa và cấu trúc chỉ mục
Chỉ mục được xác định dựa trên danh sách 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 của chỉ mục đó. Chỉ mục bao gồm tất cả các tài liệu có thể là kết quả cho các truy vấn dựa trên chỉ mục. Tài liệu chỉ được đưa vào chỉ mục khi tài liệu đó có tập giá trị được lập chỉ mục cho mọi trường được sử dụng trong chỉ mục; nếu định nghĩa chỉ mục đề cập đến một trường mà tài liệu không có tập hợp giá trị nào, tài liệu đó sẽ không xuất hiện trong chỉ mục và do đó 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 tổng hợp đượ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 phía sau mỗi truy vấn
Nếu không có chỉ mục nào cho truy vấn, thì hầu hết các cơ sở dữ liệu sẽ thu thập thông tin qua mục nội dung của chúng theo từng mục. Quá trình này làm chậm và sẽ làm chậm hơn nữa khi cơ sở dữ liệu phát triển. Cloud Firestore đảm bảo 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 hợp kết quả chứ không phải số lượng mục trong cơ sở dữ liệu.
Quản lý chỉ mục ít hơn, phát triển ứng dụng nhiều hơn
Cloud Firestore có những tính năng giúp bạn tiết kiệm thời gian quản lý chỉ mục. Chỉ mục bắt buộc cho các 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 giúp bạn xác định và tạo thêm chỉ mục mà ứng dụng yêu cầu.
Loại chỉ mục
Cloud Firestore sử dụng hai loại chỉ mục: single-field và composite. Ngoài số lượng trường được lập chỉ mục, chỉ mục đơn trường và chỉ mục tổng hợp còn khác nhau về cách bạn quản lý các trường đó.
Chỉ mục trường đơn
Chỉ mục trường đơn lưu trữ liên kết được sắp xếp của tất cả các tài liệu trong bộ sưu tập chứa một trường cụ thể. Mỗi mục nhập trong chỉ mục một trường ghi lại giá trị của một tài liệu cho một trường cụ thể và vị trí của tài liệu đó trong cơ sở dữ liệu. Cloud Firestore sử dụng các chỉ mục này để thực hiện nhiều truy vấn cơ bản. Bạn quản lý chỉ mục một trường bằng cách định cấu hình các chế độ cài đặt lập chỉ mục tự động và trường hợp miễn trừ chỉ mục của cơ sở dữ liệu.
Lập chỉ mục tự động
Theo mặc định, Cloud Firestore tự động duy trì chỉ mục một trường cho từng trường trong một tài liệu và từng trường con trên bản đồ. Cloud Firestore sử dụng các chế độ cài đặt mặc định sau đây cho chỉ mục một trường:
Đối với mỗi trường không thuộc mảng và không phải bản đồ, Cloud Firestore xác định hai chỉ mục trường đơn của bộ sưu tập, một ở chế độ tăng dần và một ở chế độ giảm dần.
Đối với mỗi trường bản đồ, Cloud Firestore tạo những nội dung sau:
- Một chỉ mục tăng dần trong phạm vi bộ sưu tập cho mỗi trường phụ không chứa mảng, không ánh xạ.
- Một chỉ mục giảm dần trong phạm vi bộ sưu tập cho mỗi trường con không thuộc mảng, không ánh xạ.
- Một mảng trong phạm vi bộ sưu tập chứa chỉ mục cho từng trường con của mảng.
- Cloud Firestore lập chỉ mục đệ quy từng trường con của bản đồ.
Đối với mỗi trường mảng trong tài liệu, Cloud Firestore sẽ tạo và duy trì chỉ mục chứa mảng trong phạm vi bộ sưu tập.
Theo mặc định, các chỉ mục trường đơn có phạm vi nhóm thu thập không được duy trì.
Trường hợp miễn trừ chỉ mục một trường
Bạn có thể miễn trừ một trường khỏi chế độ cài đặt tự động lập chỉ mục bằng cách tạo quy tắc miễn trừ chỉ mục một trường. Miễn lập chỉ mục sẽ ghi đè các chế độ cài đặt chỉ mục tự động trên toàn cơ sở dữ liệu. Quy tắc miễn trừ có thể bật chỉ mục một trường mà chế độ cài đặt tự động lập chỉ mục sẽ tắt hoặc tắt chỉ mục trường đơn mà tính năng tự động lập chỉ mục sẽ bật. Đối với những trường hợp mà trường hợp miễn trừ có thể hữu ích, hãy xem các phương pháp hay nhất về 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 bộ sưu tập trên tất cả các trường trong nhóm bộ sưu tập. Ví dụ: đối với nhóm bộ sưu tậ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 bộ sưu tập comments
và tắt tính năng lập chỉ mục tất cả các trường trong nhóm bộ sưu tập đó. Sau đó, bạn có thể thêm các trường hợp miễn trừ để chỉ lập chỉ mục những trường bắt buộc đối với truy vấn. 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 quy tắc miễn chỉ mục một trường 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 tính năng miễn chỉ mục một trường cho các trường phụ cụ thể. Nếu bạn xoá 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 chính (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ừ gốc nào.
Để tạo và quản lý các trường hợp miễn trừ đối với chỉ mục một trường, hãy xem phần Quản lý chỉ mục trong Cloud Firestore.
Chỉ số tổng hợp
Chỉ mục tổng hợp lưu trữ mục ánh xạ đượ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 các trường được sắp xếp theo thứ tự để lập chỉ mục.
Cloud Firestore sử dụng chỉ mục tổng hợp để hỗ trợ các truy vấn chưa được chỉ mục trường đơn hỗ trợ.
Cloud Firestore không tự động tạo các chỉ mục tổng hợp như đối với chỉ mục một trường vì có rất 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 tổng hợp bắt buộc khi 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 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 tổng hợp theo cách thủ công bằng cách sử dụng bảng điều khiển hoặc sử dụng CLI của Firebase. Để biết thêm thông tin về việc tạo và quản lý chỉ mục tổng hợp, hãy xem phần 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 đơn trường và chỉ mục tổng hợp theo cách khác nhau, nhưng cả hai đều yêu cầu bạn phải định cấu hình chế độ chỉ mục và phạm vi truy vấn cho chỉ mục.
Chế độ chỉ mục
Khi xác định chỉ mục, bạn sẽ chọn chế độ lập chỉ mục cho mỗi trường được lập chỉ mục. Chế độ chỉ mục của mỗi 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 lên | Hỗ trợ < , <= , == , >= , > , != , in và not-in , các mệnh đề truy vấn trên trường và hỗ trợ sắp xếp kết quả theo thứ tự tăng dần dựa trên giá trị 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, đồ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ị trường này. |
Mảng-chứa | Hỗ trợ các mệnh đề truy vấn array-contains và array-contains-any trên trường. |
Vectơ | 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 thuộc phạm vi một tập hợp hoặc một nhóm bộ sưu tập. Phạm vi nà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 tạo chỉ mục có phạm vi thu thập. Các chỉ mục này hỗ trợ các truy vấn trả về kết quả từ một tập hợp duy nhất.
- Phạm vi của nhóm thu thập
- Một nhóm bộ sưu tập bao gồm tất cả các bộ sưu tập có cùng mã bộ sưu tập. Để chạy một truy vấn nhóm bộ sưu tập trả về kết quả được lọc hoặc kết quả theo thứ tự từ một nhóm bộ sưu tập, bạn phải tạo một chỉ mục tương ứng có phạm vi nhóm bộ sưu tập.
Thứ tự mặc định và trường __name__
Ngoài việc sắp xếp tài liệu theo các chế độ chỉ mục được chỉ định cho từng trường (tăng dần hoặc giảm dần) , các 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 của trường được sắp xếp gần đây nhất trong định nghĩa chỉ mục. Ví dụ:
Thu thập | Các trường đã được lập chỉ mục | Phạm vi truy vấn |
---|---|---|
thành phố | Tên __name__ |
, Thu thập |
thành phố | __name__ |
tiểu bang, Thu thập |
thành phố | __name__ |
quốc gia, dân số, 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 đó.
Chỉ số hoàn hảo
Chỉ mục hoàn hảo cho truy vấn, cho phép thực thi truy vấn một cách hiệu quả nhất, được xác định theo thứ tự trên các thuộc tính sau:
- Các trường được sử dụng trong bộ lọc đẳng thức
- Các trường được dùng trong thứ tự sắp xếp
- Các trường được sử dụng trong bộ lọc phạm vi và bộ lọc bất đẳng thức (các trường chưa được bao gồm 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 cũng như bộ lọc dải ô và bất đẳng thức)
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ử lọc và thứ tự sắp xếp của truy vấn
- Xác định vị trí chỉ mục để bắt đầu quét bằng cách sử dụng bộ lọc đẳng thức cũng như bộ lọc phạm vi và bất đẳng thức của truy vấn trên thứ tự đầu tiên theo trường
- 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 chỉ mục:
- gặp 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, hoặc
- đến cuối chỉ mục, hoặc
- đã thu thập số lượng kết quả tối đa được yêu cầu theo truy vấn
Ví dụ về lập chỉ mục
Bằng cách tự động tạo chỉ mục trường đơn 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 các giá trị trường và các đối tượng so sánh <
, <=
, ==
, >=
, >
và in
. Đối với các trường mảng, các trường này cho phép bạn thực hiện các truy vấn array-contains
và array-contains-any
.
Để minh hoạ, hãy xem xét các ví dụ sau về quan điểm tạo chỉ mục. Đoạn mã sau sẽ 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à tags
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ử các 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 không phải mảng, một chỉ mục trường đơn giảm dần cho mỗi trường không phải mảng và một chỉ mục trường đơn cho trường mảng. Mỗi hàng trong bảng sau đây đại diện cho một mục trong chỉ mục một trường:
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ố | tiểu 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ố | Tên | Thu thập |
thành phố | tiểu 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ố | array-contains khu vực |
Thu thập |
Truy vấn được chỉ mục một trường hỗ trợ
Bằng cách 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 in
và truy vấn đẳng thức 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 truy vấn phức hợp sử dụng phép so sánh dải ô (<
, <=
, >
hoặc >=
) hoặc nếu cần sắp xếp theo trường khác, bạn phải tạo một chỉ mục tổng hợp 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"])
Truy vấn được chỉ mục tổng hợp hỗ trợ
Cloud Firestore sử dụng chỉ mục tổng hợp để hỗ trợ các truy vấn tổng hợp chưa được chỉ mục một trường hỗ trợ. Ví dụ: bạn cần có chỉ mục tổng hợp 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 tổng hợp bên dưới. Vì truy vấn sử dụng giá trị bằng nhau (==
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, các 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 | Các 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ác truy vấn tương tự nhưng có thứ tự sắp xếp giảm dần, bạn cần có thêm chỉ mục tổng hợp 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 | Các 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 |
Bạn cũng cần tạo chỉ mục tổng hợp để 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 | Các trường đã được lập chỉ mục | Phạm vi truy vấn |
---|---|---|
thành phố | thẻ array-contains, | (hoặc )Thu thập |
Các truy vấn được chỉ mục nhóm thu thập hỗ trợ
Để minh hoạ một chỉ mục có phạm vi nhóm thu thập, hãy tưởng tượng bạn 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 một trường đơn sau đây có phạm vi thu thậ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 | Các 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"])
Bây giờ, hãy tưởng tượng rằng bạn muốn truy vấn các địa danh ở tất cả các thành phố.
Để chạy truy vấn này trên nhóm bộ sưu tập bao gồm tất cả các bộ sưu tập landmarks
, bạn phải bật chỉ mục trường đơn landmarks
có phạm vi nhóm thu thập:
Thu thập | Các trường đã được lập chỉ mục | Phạm vi truy vấn |
---|---|---|
địa danh | Danh mục | (hoặc )Nhóm thu thập |
Khi bật chỉ mục này, bạn có thể truy vấn nhóm bộ sưu tậ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 bộ sưu tập trả về kết quả được lọc hoặc kết quả theo thứ tự, bạn phải bật chỉ mục tổng hợp hoặc chỉ mục một trường tương ứng có phạm vi nhóm bộ sưu tập. Tuy nhiên, những truy vấn nhóm bộ sưu tập không lọc hoặc kết quả của thứ tự không yêu cầu thêm bất kỳ định nghĩa chỉ mục nào.
Ví dụ: bạn có thể chạy truy vấn nhóm thu thậ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 trong chỉ mục cho một tài liệu. Các mục 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 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 một trường
- tên_thành phố ASC
- tên_thành phố DESC
- nhiệt độ.mùa hè ASC
- Nhiệt độ.mùa hè DESC
- nhiệt độ.mùa đông ASC
- nhiệt độ.winter DESC
- Mảng vùng lân cận Chứa (ASC và DESC)
Chỉ số tổng hợp
- tên_thành phố ASC, các vùng lân cận ARRAY
- City_name DESC, các vùng lân cận ARRAY
Mục nhập chỉ mục
Cấu hình lập chỉ mục này dẫn đến 18 mục nhập chỉ mục sau đây cho tài liệu:
Chỉ mục | Dữ liệu đã lập chỉ mục |
---|---|
Mục nhập chỉ mục một trường | |
tên_thành phố ASC | City_name: "San Francisco" |
tên_thành phố DESC | City_name: "San Francisco" |
nhiệt độ.mùa hè ASC | nhiệt độ.mùa hè: 67 |
Nhiệt độ.mùa hè DESC | nhiệt độ.mùa hè: 67 |
nhiệt độ.mùa đông ASC | nhiệt độ.winter: 55 |
nhiệt độ.winter DESC | nhiệt độ.winter: 55 |
Mảng vùng lân cận Chứa ASC | vùng lân cận: "Sứ mệnh" |
Mảng vùng lân cận Chứa DESC | vùng lân cận: "Sứ mệnh" |
Mảng vùng lân cận Chứa ASC | vùng lân cận: "Khu vực trung tâm" |
Mảng vùng lân cận Chứa DESC | vùng lân cận: "Khu vực trung tâm" |
Mảng vùng lân cận Chứa ASC | vùng lân cận: "Marina" |
Mảng vùng lân cận Chứa DESC | vùng lân cận: "Marina" |
Các mục trong chỉ mục tổng hợp | |
tên_thành phố ASC, các vùng lân cận ARRAY | City_name: "San Francisco", vùng lân cận: "Sứ mệnh" |
tên_thành phố ASC, các vùng lân cận ARRAY | City_name: "San Francisco", vùng lân cận: "Downtown" |
tên_thành phố ASC, các vùng lân cận ARRAY | City_name: "San Francisco", vùng lân cận: "Marina" |
City_name DESC, các vùng lân cận ARRAY | City_name: "San Francisco", vùng lân cận: "Sứ mệnh" |
City_name DESC, các vùng lân cận ARRAY | City_name: "San Francisco", vùng lân cận: "Downtown" |
City_name DESC, các vùng lân cận ARRAY | City_name: "San Francisco", vùng lân cận: "Marina" |
Chỉ số và giá
Chỉ số đóng góp vào chi phí lưu trữ của ứng dụng. Để biết thêm về cách tính kích thước bộ nhớ cho các chỉ mục, vui lòng xem phần Kích thước mục nhập chỉ mục.
Tận dụng lợi thế của việc 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 đề đẳng thức (==
) 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 các bộ lọc đẳng thức đơn giản để xây dựng các chỉ mục tổng hợp cần thiết cho các truy vấn bằng nhau 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 tình huống mà bạn có thể tận dụng việc hợp nhất chỉ mục. Ví dụ: hãy tưởng tượng bộ sưu tập restaurants
cho một ứng dụng xếp hạng nhà hàng:
nhà hàng
Bánh mì kẹp thịt
name : "Burger Thyme"
category : "burgers"
city : "San Francisco"
editors_pick : true
star_rating : 4
Bây giờ, hãy tưởng tượng ứng dụng này sử dụng các truy vấn như những truy vấn dưới đây. Lưu ý ứng dụng sử dụng tổ hợp mệnh đề bằng nhau cho category
, city
và editors_pick
trong khi luôn sắp xếp theo star_rating
tăng dần:
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 chỉ mục cho từng truy vấn:
Thu thập | Các trường đã được lập chỉ mục | Phạm vi truy vấn |
---|---|---|
nhà hàng | Danh mục | , xếp hạng sao_Thu thập |
nhà hàng | thành phố, xếp hạng sao | Thu thập |
nhà hàng | Danh mục | , thành phố, điểm xếp hạng saoThu thập |
nhà hàng | danh mục, thành phố, biên tập viên_pick, điểm xếp hạng theo sao | Thu thập |
Một giải pháp hiệu quả 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 các chỉ mục của Cloud Firestore cho các mệnh đề bằng nhau:
Thu thập | Các trường đã được lập chỉ mục | Phạm vi truy vấn |
---|---|---|
nhà hàng | Danh mục | , xếp hạng sao_Thu thập |
nhà hàng | thành phố, xếp hạng sao | Thu thập |
nhà hàng | Editor_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ợ truy vấn bổ sung:
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 đây áp dụng cho chỉ mục. Để biết tất cả các 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 tổng hợp tối đa cho một cơ sở dữ liệu |
|
Số lượng cấu hình một trường 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ụ: trường hợp miễn lập chỉ mục một trường và chính sách TTL trên cùng một trường sẽ được tính là một cấu hình trường vào giới hạn. |
Số mục nhập chỉ mục tối đa cho mỗi tài liệu |
40.000 Số mục nhập chỉ mục là tổng của các mục sau của một tài liệu:
Để xem cách Cloud Firestore biến một tài liệu và một nhóm chỉ mục thành các mục nhập chỉ mục, hãy xem ví dụ về số lượng mục nhập trong chỉ mục này. |
Số lượng trường tối đa trong một chỉ mục tổng 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 của mục nhập chỉ mục, hãy xem phần kích thước của mục nhập chỉ mục. |
Tổng kích thước tối đa của các mục trong chỉ mục trong một tài liệu |
8 MiB Tổng kích thước là tổng của các kích thước sau 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 Các giá trị của trường vượt quá 1500 byte sẽ bị cắt bớt. Các truy vấn liên quan đến các 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ề lập chỉ mục
Đối với hầu hết ứng dụng, bạn có thể dựa vào tính năng tự động lập chỉ mục và đường liên kết 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 trừ một trường trong các trường hợp sau:
Cách | Mô tả |
---|---|
Trường chuỗi lớn | Nếu bạn 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ể cắt giảm chi phí lưu trữ bằng cách miễn lập chỉ mục trường này. |
Tốc độ ghi cao vào bộ sưu tập chứa 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/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 này để bỏ qua giới hạn này. Trong một trường hợp sử dụng IoT có tốc độ ghi cao, chẳng hạn như một tập hợp chứa tài liệu có trường dấu thời gian có thể đạt tới giới hạn 500 lần ghi/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à một 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 ở tỷ lệ lưu lượng truy cập cao hơn. Tốt nhất là bạn nên thêm các trường hợp miễn trừ một trường cho các trường TTL. |
Các trường lớn liên quan đến bản đồ hoặc mảng | 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 trên mỗi tài liệu. Nếu không truy vấn dựa trên một mảng lớn hoặc trường ánh xạ, bạn không nên lập chỉ mục mảng hoặc trường đó. |
Nếu bạn đang dùng các 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 cân nhắc khi lập chỉ mục để tối ưu hoá hiệu suất và chi phí của các truy vấn trên Cloud Firestore
Để biết thêm thông tin về cách giải quyết các vấn đề về việc lập chỉ mục (chỉ mục fanout, lỗi INVALID_ARGUMENT
), hãy xem trang khắc phục sự cố.