Các loại chỉ mục trong Cloud Firestore

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 một cuốn 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 truy vấn đến cơ sở dữ liệu, cơ sở dữ liệu có thể sử dụng chỉ mục để tra cứu nhanh chóng vị trí của các mục 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 đơnchỉ 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 dữ liệu qua từng mục nội dung của chúng, một quá 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 đả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ả các truy vấn. Kết quả là 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.

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ý chỉ mục. Các chỉ mục cần thiết 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 tra ứ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 đơntrường tổng hợp . Ngoài 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 còn 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 nhập 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 một trường 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 trong cơ sở dữ liệu của bạn.

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 một trường:

  • Đố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 trong phạm vi bộ sưu tập cho từng 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 bộ sưu tập cho từng trường con không phải mảng, không phải bản đồ.
    • Một mảng phạm vi tập hợp chứa chỉ mục cho mỗi trường con mảng.
    • Cloud Firestore lập chỉ mục đệ quy cho 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 tập hợp.

  • Các chỉ mục một trường với phạm vi nhóm thu thập không được duy trì theo mặc định.

Miễn trừ chỉ mục một trường

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 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à tính năng lập chỉ mục tự động sẽ kích hoạt. Đối với các 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 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 comments của nhóm bộ sưu tập, 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 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 miễn trừ để chỉ lập chỉ mục các trường bắt buộc cho truy vấn của mình. Việc giảm số lượng trường được lập chỉ mục 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 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 các miễn trừ chỉ mục một trường cho các trường con cụ thể. Nếu bạn xóa phần ngoại lệ cho một trường con, trường con đó sẽ kế thừa các thiết lập miễn trừ của trường cha, nếu chúng tồn tại, hoặc các thiết lập trên toàn cơ sở dữ liệu nếu không có ngoại lệ cha tồn tại.

Để tạo và quản lý các miễn trừ chỉ mục một trường, hãy xem 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ữ á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 để 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ì có thể có số lượng lớn các kết hợp trường. Thay vào đó, Cloud Firestore giúp bạn xác định và tạo các chỉ mục tổng hợp cần thiết 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 bắt buộc trước, Cloud Firestore sẽ trả về thông báo lỗi chứa liên kết mà bạn có thể theo dõi để 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 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 đặt 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 đặt 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 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ướng lên Hỗ trợ các mệnh đề truy vấn < , <= , == , >= , > , != , innot-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.
tên giảm dần_hướng xuống Hỗ trợ các mệnh đề truy vấn < , <= , == , >= , > , != , innot-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ợ array-containsarray-contains-any mảng nào trên trường.

Phạm vi truy vấn

Mỗi chỉ mục nằm trong phạm vi 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 với 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.

Phạm vi nhóm thu thập
Nhóm bộ sưu tập bao gồm tất cả các bộ sưu tập có cùng một ID bộ sưu tập. Để chạy truy vấn nhóm bộ sưu tập trả về các 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 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 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 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 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 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ố tên, __name__ Bộ sưu tập
các thành phố , __name__ Bộ sưu tập
các thành phố mũi tên_nước , tên_dân số tăng lên, __name__ 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 hỗ trợ nhanh chóng các truy vấn cơ sở dữ liệu cơ bản nhất. Chỉ mục một trường 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 bộ so sánh < , <= , == , >= , >in . Đối với các trường mảng, chúng cho phép bạn thực hiện các truy vấn array-containsarray-contains-any .

Để minh họa, hãy xem xét 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 các trường name , state , country , capital , populationtags 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à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 biểu thị một mục 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 mũi tên Bộ sưu tập
các thành phố trạng thái Bộ sưu tập
các thành phố mũi tên_đất nước Bộ sưu tập
các thành phố mũi Bộ sưu tập
các thành phố Bộ sưu tập
các thành phố tên_mũi tên Bộ sưu tập
các thành phố mũi tên_trạng thái Bộ sưu tập
các thành phố mũi tên_nước Bộ sưu tập
các thành phố mũi Bộ sưu tập
các thành phố mũi tên_dân số Bộ sưu tập
các thành phố vùng array-contains Bộ sưu tập

Truy vấn được hỗ trợ bởi 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:

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 các truy vấn đẳng thức in và ghé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 bạn cần chạy truy vấn kết hợp sử dụng so sánh phạm vi ( < , <= , > hoặc >= ) hoặc nếu bạn cần sắp xếp theo trường khác, bạn phải tạo 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 :

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 hỗ trợ bởi 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 cá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:

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)

Những 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 một chỉ mục tổng hợp bổ sung 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")
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ố mũi tên_nước , mũi tên_dân số Bộ sưu tập
các thành phố mũi tên_nước , mũi tên_dân số Bộ sưu tập

Bạn cũng cần tạo chỉ mục tổng hợp để kết hợp truy 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)
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ố mảng chứa các thẻ, chữ (hoặc mũi ) Bộ sưu tập

Truy vấn được hỗ trợ bởi chỉ mục nhóm bộ sưu tập

Để chứng minh một chỉ mục có 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 :

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" });

Sử dụng chỉ mục một trường sau đây với phạm vi thu thậ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
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 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 sưu tầm

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 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 trường đơn hoặc chỉ mục tổng hợp tương ứng với phạm vi nhóm bộ sưu tập. Tuy nhiên, các 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 tuyển tập sau đây mà không cần bật chỉ mục bổ sung:

Web
db.collectionGroup("landmarks").get()

Mục chỉ mục

Các chỉ mục được cấu hình trong dự án của bạ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. 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 đây minh họa các mục 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 trường đơn

  • tên_thành phố ASC
  • tên_thành phố DESC
  • nhiệt độ.summer ASC
  • nhiệt độ.mùa hè DESC
  • nhiệt độ.winter ASC
  • nhiệt độ.winter DESC
  • vùng lân cận Mảng chứa (ASC và DESC)

Chỉ số tổng hợp

  • city_name ASC, vùng lân cận ARRAY
  • city_name DESC, vùng lân cận ARRAY

Mục 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 cho tài liệu:

Mục lục Dữ liệu được 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 độ.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 độ.winter DESC nhiệt độ.mùa đông: 55
Mảng vùng lân cận Chứa ASC khu vực lân cận: "Sứ mệnh"
Mảng vùng lân cận Chứa DESC khu vực lân cận: "Sứ mệnh"
Mảng vùng lân cận Chứa ASC vùng lân cận: "Trung tâm thành phố"
Mảng vùng lân cận Chứa DESC vùng lân cận: "Trung tâm thành phố"
Mảng vùng lân cận Chứa ASC khu vực lân cận: "Bến du thuyền"
Mảng vùng lân cận Chứa DESC khu vực lân cận: "Bến du thuyền"
Mục nhập chỉ mục tổng hợp
city_name ASC, vùng lân cận ARRAY city_name: "San Francisco", vùng lân cận: "Sứ mệnh"
city_name ASC, vùng lân cận ARRAY city_name: "San Francisco", vùng lân cận: "Trung tâm thành phố"
city_name ASC, vùng lân cận ARRAY city_name: "San Francisco", vùng lân cận: "Marina"
city_name DESC, vùng lân cận ARRAY city_name: "San Francisco", vùng lân cận: "Sứ mệnh"
city_name DESC, vùng lân cận ARRAY city_name: "San Francisco", vùng lân cận: "Trung tâm thành phố"
city_name DESC, vùng lân cận ARRAY city_name: "San Francisco", vùng lân cận: "Marina"

Chỉ số và giá cả

Các chỉ mục góp phần vào chi phí lưu trữ cho ứ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 .

Lợi 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 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 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 việc hợp nhất chỉ mục. Ví dụ: hãy tưởng tượng bộ sưu tập restaurants cho ứng dụng xếp hạng nhà hàng:

  • bộ nhà hàng

    • burgerthyme

      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 giống như các truy vấn bên dưới. Lưu ý rằng ứng dụng sử dụng kết hợp các mệnh đề đẳng thức cho category , cityeditors_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 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 , sao_xếp hạng Bộ sưu tập
nhà hàng thành phố, sao_xếp hạng Bộ sưu tập
nhà hàng mũi , phố trở lên, sao_xếp hạng Bộ sưu tập
nhà hàng mục trở lên, , tên_biên tập viên trở lên_pick, sao_xếp hạng 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 hợp nhất các chỉ mục cho mệnh đề đẳng thức của Cloud Firestore:

Bộ sưu tập Các trường được lập chỉ mục Phạm vi truy vấn
nhà hàng , sao_xếp hạng Bộ sưu tập
nhà hàng thành phố, sao_xếp hạng Bộ sưu tập
nhà hàng biên tập viên_pick, sao_xếp hạng Bộ sưu tập

Bộ chỉ mục này không chỉ nhỏ hơn mà còn hỗ trợ một 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 áp dụng cho chỉ mục. Để biết 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ố lượng chỉ mục tổng hợp tối đa cho cơ sở dữ liệu
Số lượng cấu hình một trường tối đa cho 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ụ: miễn trừ 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 hướng tới giới hạn.

Số lượng mục chỉ mục tối đa cho mỗi tài liệu

40.000

Số lượng mục chỉ mục là tổng của các mục sau cho một tài liệu:

  • Số mục nhập chỉ mục một trường
  • Số lượng mục chỉ mục tổng hợp

Để xem cách Cloud Firestore biến tài liệu và tập hợp chỉ mục thành 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 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 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 các giá trị sau cho một tài liệu:

  • Tổng kích thước của các mục nhập chỉ mục một trường của tài liệu
  • Tổng kích thước của các mục chỉ mục tổng hợp của 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 trên 1500 byte sẽ bị cắt bớt. Các truy vấn liên quan đến giá trị trường bị cắt ngắn 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 tính năng lập chỉ mục tự động và các 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 miễn trừ 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, 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ốc độ ghi cao vào 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 một bộ sưu tập, chẳng hạn như dấu thời gian, thì tốc độ ghi tối đa vào bộ sưu tập là 500 lần ghi mỗi giây. Nếu bạn 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 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 các 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 miễn trừ một trường cho các trường TTL của bạn.

    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 tới giới hạn 40.000 mục nhập chỉ mục cho mỗi tài liệu. Nếu bạn không truy vấn dựa trên một 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 vấn đề về lập chỉ mục (lỗi xuất hiện chỉ mục, lỗi INVALID_ARGUMENT ), hãy xem trang khắc phục sự cố .