Các chỉ mục là một yếu tố quan trọng trong hiệu suất của cơ sở dữ liệu. Giống như chỉ mục của sách ánh xạ các chủ đề trong sách tới số trang, chỉ mục cơ sở dữ liệu ánh xạ các mục trong cơ sở dữ liệu tới vị trí của chúng trong cơ sở dữ liệu. Khi bạn gửi một truy vấn đến cơ sở dữ liệu, cơ sở dữ liệu có thể sử dụng một chỉ mục để tra cứu nhanh 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, chỉ mục trường đơn và chỉ mục tổng hợp .
Một chỉ mục đằng sau mỗi truy vấn
Nếu không có chỉ mục nào tồn tại cho một truy vấn, 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 của chúng, một quá trình chậm sẽ 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 các chỉ mục cho tất cả cá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ố 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 bao gồm các tính năng giúp giảm lượng thời gian bạn cần dành cho việc quản lý các chỉ mục. Các chỉ mục cần thiết cho các truy vấn cơ bản nhất được tạo tự động cho bạn. Khi bạn sử dụng và thử nghiệm ứng dụng của mình, Cloud Firestore sẽ giúp bạn xác định và tạo các chỉ mục bổ sung mà ứng dụng của bạn yêu cầu.
Các loại chỉ mục
Cloud Firestore sử dụng hai loại chỉ mục: trường đơn và tổng hợp . Bên cạnh số lượng trường được lập chỉ mục, chỉ mục trường đơn và chỉ mục tổng hợp khác nhau về cách bạn quản lý chúng.
Chỉ mục trường đơn
Chỉ mục một trường lưu trữ ánh xạ được sắp xếp của tất cả các tài liệu trong bộ sưu tập có chứa một trường cụ thể. Mỗi mục trong chỉ mục một trường ghi lại giá trị của 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ý các chỉ mục trường đơn bằng cách định cấu hình cài đặt lập chỉ mục tự động và miễn trừ chỉ mục cho cơ sở dữ liệu của mình.
lập chỉ mục tự động
Theo mặc định, Cloud Firestore tự động duy trì các chỉ mục trường đơn cho từng trường trong tài liệu và từng trường con trong bản đồ. Cloud Firestore sử dụng các cài đặt mặc định sau cho các chỉ mục trường đơn:
Đối với mỗi trường không phải mảng và không phải bản đồ, Cloud Firestore xác định hai chỉ mục trường đơn trong phạm vi 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ư sau:
- Một chỉ mục tăng dần phạm vi bộ sưu tậ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 phạm vi bộ sưu tập cho mỗi trường con không theo mảng, không theo bản đồ.
- Một chỉ mục chứa mảng 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 từng trường con bản đồ.
Đối với mỗi trường mảng trong tài liệu, Cloud Firestore tạo và duy trì chỉ mục chứa mảng trong phạm vi bộ sưu tập.
Các chỉ mục trường đơn với phạm vi nhóm bộ sưu tập không được duy trì theo mặc định.
Miễn trừ chỉ mục trường đơn
Bạn có thể miễn trừ một trường khỏi cài đặt lập chỉ mục tự động của mình bằng cách tạo miễn trừ chỉ mục một trường. Miễn trừ lập chỉ mục sẽ ghi đè cài đặt lập chỉ mục tự động trên toàn cơ sở dữ liệu. Việc miễn trừ có thể kích hoạt chỉ mục một trường mà cài đặt lập chỉ mục tự động của bạn sẽ vô hiệu hóa hoặc vô hiệu hóa chỉ mục một trường mà lập chỉ mục tự động sẽ bật. Đối với những 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 .
Nếu bạn tạo miễn trừ chỉ mục một trường cho trường bản đồ, thì các trường con của bản đồ sẽ kế thừa các cài đặt đó. Tuy nhiên, bạn có thể xác định miễn trừ chỉ mục trường đơn cho các trường con cụ thể. Nếu bạn xóa một miễn trừ cho một trường con, thì trường con đó sẽ kế thừa các thiết lập miễn trừ của trường mẹ nếu chúng tồn tại, hoặc các thiết đặt toàn bộ cơ sở dữ liệu nếu không tồn tại các thiết lập miễn trừ của trường mẹ.
Để tạo và quản lý các trường hợp miễn trừ chỉ mục trường đơn, hãy xem Quản lý chỉ mục trong Cloud Firestore .
chỉ mục tổng hợp
Một chỉ mục tổng hợp lưu trữ một ánh xạ được sắp xếp của tất cả các tài liệu trong một bộ sưu tậ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 các 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 giống như đối với các chỉ mục trường đơn vì số lượng lớn các kết hợp trường có thể có. 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 bạn xây dựng ứng dụng của mình.
Nếu bạn thử truy vấn ở trên mà không tạo chỉ mục được yêu cầu trước, Cloud Firestore sẽ trả về thông báo lỗi có chứa liên kết mà bạn có thể nhấp vào để tạo chỉ mục bị thiếu. Điều này xảy ra bất cứ khi nào bạn thử truy vấn không được chỉ mục hỗ trợ. Bạn cũng có thể xác định và quản lý các 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 bằng cách sử dụng Firebase CLI . Để biết thêm về cách tạo và quản lý chỉ mục tổng hợp, hãy xem 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 trường đơn và chỉ mục tổng hợp 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 bạn xác định một chỉ mục, bạn chọn một chế độ chỉ mục cho từng 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 từ các chế độ chỉ mục sau:
Chế độ chỉ mục | Sự miêu tả |
---|---|
Tăng dần | Hỗ trợ các mệnh đề truy vấn < , <= , == , >= , > , != , in và not-in 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 và 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 array-contains và array-contains-any trên trường. |
phạm vi truy vấn
Mỗi chỉ mục nằm trong phạm vi của một bộ sưu tập hoặc một nhóm bộ sưu tập. Đây được gọi là phạm vi truy vấn của chỉ mục:
- Phạm vi thu thập
- Cloud Firestore tạo các chỉ mục có phạm vi thu thập theo mặc định. Các chỉ mục này hỗ trợ các truy vấn trả về kết quả từ một bộ sưu tập duy nhất.
- Phạm vi nhóm bộ sưu tậ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 ID 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 sắp xếp từ một nhóm bộ sưu tập, bạn phải tạo một chỉ mục tương ứng với 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 á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 tài liệu đầy đủ. Điều này có nghĩa là các tài liệu trong tập kết quả có cùng giá trị trường đượ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 cuối cùng trong định nghĩa chỉ mục. Ví dụ:
Bộ sưu tập | Các trường được lập chỉ mục | phạm vi truy vấn |
---|---|---|
các thành phố | __name__ | name, Bộ sưu tập |
các thành phố | __name__ | state, Bộ sưu tập |
các thành phố | __name__ | gia đi lên, số đi lên, Bộ sưu tậ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 đó.
Ví dụ lập chỉ mục
Bằng cách tự động tạo các 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 giá trị trường và bộ so sánh <
, <=
, ==
, >=
, >
và in
. Đối với các trường mảng, chúng cho phép bạn thực hiện array-contains
và array-contains-any
truy vấn nào.
Để minh họa, hãy kiểm tra các ví dụ sau từ quan điểm tạo chỉ mục. Đoạn mã sau tạo một vài tài liệu city
trong bộ sưu tập cities
và đặt name
, state
, country
, capital
, population
và tags
cho mỗi tài liệu:
mạng
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ài đặt lập chỉ mục tự động mặc định, Cloud Firestore 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 chứa mảng cho trường mảng. Mỗi hàng trong bảng sau đại diện cho một mục nhập trong chỉ mục một trường:
Bộ sưu tập | Trường được lập chỉ mục | phạm vi truy vấn |
---|---|---|
các thành phố | tên | Bộ sưu tập |
các thành phố | Bộ sưu tập | |
các thành phố | quốc gia | Bộ sưu tập |
các thành phố | vốn | Bộ sưu tập |
các thành phố | dân số | Bộ sưu tập |
các thành phố | tên | Bộ sưu tập |
các thành phố | thái đi xuống | Bộ sưu tập |
các thành phố | nước | Bộ sưu tập |
các thành phố | vốn | Bộ sưu tập |
các thành phố | số giảm | Bộ sưu tập |
các thành phố | vùng array-contains | Bộ sưu tập |
Các truy vấn được hỗ trợ bởi các chỉ mục trường đơn
Bằng cách sử dụng các chỉ mục trường đơn được tạo tự động này, bạn có thể chạy các truy vấn đơn giản như sau:
mạng
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 các truy vấn đẳng thức in
và gộp ( ==
):
mạng
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 bạn 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 bạn cần sắp xếp theo một trường khác, bạn phải tạo một chỉ mục tổng hợp cho truy vấn đó.
array-contains
mảng cho phép bạn truy vấn trường mảng regions
:
mạng
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 các chỉ mục tổng hợp
Cloud Firestore sử dụng các chỉ mục tổng hợp để hỗ trợ các truy vấn phức hợp chưa được chỉ mục trường đơn hỗ trợ. Ví dụ: bạn sẽ cần một chỉ mục tổng hợp cho các truy vấn sau:
mạng
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 đẳng thức ( ==
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.
Bộ sưu tập | Các trường được lập chỉ mục | phạm vi truy vấn |
---|---|---|
các thành phố | (hoặc ) quốc gia, dân số | Bộ sưu tập |
Để chạy các truy vấn tương tự nhưng với thứ tự sắp xếp giảm dần, bạn cần có một chỉ mục tổng hợp bổ sung theo hướng giảm dần cho population
:
mạng
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")
Bộ sưu tập | Các trường được lập chỉ mục | phạm vi truy vấn |
---|---|---|
các thành phố | gia đi lên, số đi lên | Bộ sưu tập |
các thành phố | gia đi lên , số đi xuống | Bộ sưu tập |
Bạn cũng cần tạo một chỉ mục tổng hợp để kết hợp array-contains
hoặc array-contains-any
truy vấn nào với các mệnh đề bổ sung.
mạng
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)
Bộ sưu tập | Các trường được lập chỉ mục | phạm vi truy vấn |
---|---|---|
các thành phố | thẻ chứa mảng , viết hoa | (hoặc )Bộ sưu tập |
Các truy vấn được hỗ trợ bởi chỉ mục nhóm bộ sưu tập
Để minh họa một chỉ mục với phạm vi nhóm bộ sưu tập, hãy tưởng tượng bạn thêm một bộ sưu tập con landmarks
vào một số tài liệu city
:
mạng
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" });
Bằng cách sử dụng chỉ mục một trường sau với phạm vi bộ sưu tập, bạn có thể truy vấn bộ sưu tập landmarks
của một thành phố dựa trên trường category
:
Bộ sưu tập | Các trường được lập chỉ mục | phạm vi truy vấn |
---|---|---|
Các địa danh | danh mục | (hoặc )Bộ sưu tập |
mạng
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 quan tâm đến việc truy vấn các địa danh trên 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 một landmarks
với phạm vi nhóm bộ sưu tập:
Bộ sưu tập | Các trường được lập chỉ mục | phạm vi truy vấn |
---|---|---|
Các địa danh | danh mục | (hoặc )Nhóm bộ sưu tập |
Với chỉ mục này được bật, bạn có thể truy vấn nhóm bộ sưu tập landmarks
:
mạng
var landmarksGroupRef = db.collectionGroup("landmarks"); landmarksGroupRef.where("category", "==", "park") landmarksGroupRef.where("category", "in", ["park", "museum"])
Để chạy truy vấn nhóm bộ sưu tập trả về kết quả được lọc hoặc sắp xếp, bạn phải bật chỉ mục tổng hợp hoặc trường đơn tương ứng với phạm vi nhóm bộ sưu tập. Tuy nhiên, truy vấn nhóm bộ sưu tậ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 bộ sưu tập sau mà không cần bật chỉ mục bổ sung:
mạng
db.collectionGroup("landmarks").get()
Mục nhập chỉ mục
Các chỉ mục được định cấu hình của dự án của bạn và cấu trúc của tài liệu xác định số lượng mục nhập chỉ mục cho tài liệu. Các 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 minh họa 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
- city_name ASC
- city_name DESC
- nhiệt độ.summer ASC
- nhiệt độ.mùa hè DESC
- nhiệt độ.winter ASC
- nhiệt độ.mùa đông DESC
- Vùng lân cận Array Chứa (ASC và DESC)
chỉ mục tổng hợp
- city_name ASC, khu phố ARRAY
- city_name DESC, khu phố 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:
Mục lục | dữ liệu được lập chỉ mục |
---|---|
Các mục nhập chỉ mục một trường | |
city_name ASC | city_name: "San Francisco" |
city_name DESC | city_name: "San Francisco" |
nhiệt độ.summer ASC | nhiệt độ.mùa hè: 67 |
nhiệt độ.mùa hè DESC | nhiệt độ.mùa hè: 67 |
nhiệt độ.winter ASC | nhiệt độ.mùa đông: 55 |
nhiệt độ.mùa đông DESC | nhiệt độ.mùa đông: 55 |
Mảng vùng lân cận Chứa ASC | khu phố: "Sứ mệnh" |
Mảng vùng lân cận Chứa DESC | khu phố: "Sứ mệnh" |
Mảng vùng lân cận Chứa ASC | khu phố: "Trung tâm thành phố" |
Mảng vùng lân cận Chứa DESC | khu phố: "Trung tâm thành phố" |
Mảng vùng lân cận Chứa ASC | khu phố: "Bến du thuyền" |
Mảng vùng lân cận Chứa DESC | khu phố: "Bến du thuyền" |
Các mục nhập chỉ mục tổng hợp | |
city_name ASC, khu phố ARRAY | city_name: "San Francisco", các vùng lân cận: "Sứ mệnh" |
city_name ASC, khu phố ARRAY | city_name: "San Francisco", khu vực lân cận: "Trung tâm thành phố" |
city_name ASC, khu phố ARRAY | city_name: "San Francisco", các vùng lân cận: "Bến du thuyền" |
city_name DESC, khu phố ARRAY | city_name: "San Francisco", các vùng lân cận: "Sứ mệnh" |
city_name DESC, khu phố ARRAY | city_name: "San Francisco", khu vực lân cận: "Trung tâm thành phố" |
city_name DESC, khu phố ARRAY | city_name: "San Francisco", các vùng lân cận: "Bến du thuyền" |
Chỉ số và giá cả
Các chỉ mục đóng góp vào chi phí lưu trữ của ứng dụng của bạn. Để biết thêm về cách tính kích thước lưu trữ cho các chỉ mục, hãy xem Kích thước mục nhập chỉ mục .
Tận dụng 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 yêu cầu 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 ( ==
) và mệnh đề orderBy
, tùy chọn, 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 đẳng thức lớn hơn.
Bạn có thể giảm chi phí lập chỉ mục bằng cách xác định các tình huống mà bạn có thể tận dụng lợi thế của việc hợp nhất chỉ mục. Ví dụ: hãy tưởng tượng một bộ sưu tập restaurants
cho ứng dụng xếp hạng nhà hàng:
bộ
nhà hàngname : "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ư bên dưới. Lưu ý rằng ứng dụng sử dụng kết hợp các mệnh đề bình đẳng cho category
, city
và editors_pick
trong khi luôn sắp xếp theo mức tăng dần star_rating
:
mạng
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:
Bộ sưu tập | Các trường được lập chỉ mục | phạm vi truy vấn |
---|---|---|
nhà hàng | danh mục, star_rating | Bộ sưu tập |
nhà hàng | thành phố, star_rating | Bộ sưu tập |
nhà hàng | danh mục, thành phố, star_rating | Bộ sưu tập |
nhà hàng | danh mục, thành phố, editors_pick, star_rating | Bộ sưu tập |
Là một giải pháp tốt hơn, bạn có thể giảm số lượng chỉ mục bằng cách tận dụng khả năng của Cloud Firestore để hợp nhất các chỉ mục cho mệnh đề bình đẳng:
Bộ sưu tập | Các trường được lập chỉ mục | phạm vi truy vấn |
---|---|---|
nhà hàng | danh mục, star_rating | Bộ sưu tập |
nhà hàng | thành phố, star_rating | Bộ sưu tập |
nhà hàng | editors_pick, star_rating | Bộ sưu tập |
Tập hợp các chỉ mục này không chỉ nhỏ hơn mà còn hỗ trợ một truy vấn bổ sung:
mạng
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 các chỉ mục. Đối với tất cả hạn ngạch và giới hạn, hãy xem Hạn ngạch và giới hạn .
Giới hạn | Chi tiết |
---|---|
Số chỉ mục tổng hợp tối đa cho một cơ sở dữ liệu | 200 Bạn có thể liên hệ với bộ phận hỗ trợ để yêu cầu tăng giới hạn này. |
Số lượng cấu hình trường đơn tối đa cho cơ sở dữ liệu | 200 Cho phép tổng cộng 200 cấu hình cấp trường. Một cấu hình trường có thể chứa nhiều cấu hình cho cùng một trường. Ví dụ: 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 được tính là một cấu hình trường đối với 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ố lượng mục nhập chỉ mục là tổng của những điều 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 các 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 chỉ mục này . |
Số trường tối đa trong 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 mục nhập chỉ mục, hãy xem 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 tài liệu | 8 MiB Tổng kích thước là tổng của những điều sau đây cho một tài liệu: |
Kích thước tối đa của một giá trị trường được lập chỉ mục | 1500 byte Giá trị trường trên 1500 byte 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. |
Lập chỉ mục các phương pháp hay nhất
Đối với hầu hết các ứng dụng, bạn có thể dựa vào lập chỉ mục tự động và 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 có thể muốn thêm các trường hợp miễn trừ cho một trường trong các trường hợp sau:
Trường hợp | Sự miêu 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 sử 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 cho trường đó. |
Tỷ lệ ghi cao vào một bộ sưu tậ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 bộ sưu tập, chẳng hạn như dấu thời gian, thì tốc độ ghi tối đa cho bộ sưu tập là 500 lần 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 bộ sưu tập chứa tài liệu có trường dấu thời gian có thể đạt đến giới hạn 500 lần 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. 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ốc độ lưu lượng truy cập cao hơn. Cách tốt nhất là thêm các trường hợp miễn trừ một trường cho các trường TTL của bạn. |
Mảng lớn hoặc trường bản đồ | Các trường bản đồ hoặc mảng lớn có thể đạt tới giới hạn 40.000 mục nhập chỉ mục trên mỗi tài liệu. Nếu bạn không truy vấn dựa trên mảng lớn hoặc trường bản đồ, bạn nên miễn lập chỉ mục cho nó. |
Để biết thêm thông tin về cách giải quyết các sự cố lập chỉ mục (phân tán chỉ mục, lỗi INVALID_ARGUMENT
), hãy xem trang khắc phục sự cố .