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

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 ánh xạ các chủ đề trong một cuốn sách với số trang, chỉ mục cơ sở dữ liệu ánh xạ các mặt hàng 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 thì 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ả 2 loại chỉ mục mà Cloud Firestore sử dụng, chỉ mục trường đơnchỉ mục tổng hợp chỉ mục.

Đị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 các trường của một tài liệu nhất định, trong đó có chế độ chỉ mục tương ứng cho từng trường.

Chỉ mục chứa một mục nhập cho mọi trường có tên trong phần định nghĩa chỉ mục. Chiến lược phát hành đĩa đơn chỉ mục bao gồm tất cả tài liệu là kết quả tiềm năng 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 khi tài liệu đó có giá trị được lập chỉ mục đặt 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ị, 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 tổng hợp được sắp xếp theo các 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, hầu hết cơ sở dữ liệu sẽ thu thập thông tin thông qua mục nội dung của chúng theo mục, một quá trình chậm lại 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 dựa 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 thời gian bạn đầu tư cho việc quản lý chỉ mục. Các chỉ mục bắt buộc cho phần cơ bản nhất các truy vấn sẽ được tạo tự động cho bạn. Khi bạn sử dụng và thử nghiệm ứng dụng, Cloud Firestore giúp bạn xác định và tạo thêm 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: một trườngkết hợp. Ngoài số lượng các trường được lập 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 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 một tập hợ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 trong 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 các 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ơ sở dữ liệu cài đặt lập chỉ mục tự động và miễn trừ chỉ mục.

Lập chỉ mục tự động

Theo mặc định, Cloud Firestore tự động duy trì chỉ mục một trường đơn cho từng trường trong một tài liệu và mỗi trường phụ trong bản đồ. Cloud Firestore sử dụng các chế độ cài đặt mặc định sau đây 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 sẽ xác định hai Chỉ mục trường đơn collection-scope, một ở chế độ tăng dần và một chiến dịch ở 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 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 chỉ mục chứa mảng trong phạm vi bộ sưu tập.

  • Các chỉ mục trường đơn có phạm vi nhóm thu thập không được duy trì bằng mặc định.

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 tính năng 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. Một miễn trừ có thể bật chỉ mục một trường mà chế độ cài đặt lập chỉ mục tự động của bạn nếu không thì sẽ vô hiệu hoá hoặc vô hiệu hoá chỉ mục một trường đơn tự động lập chỉ mục sẽ bật. Đối với các trường hợp mà việc 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ả 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 đến * để khớp với tất cả các trường trong nhóm thu thậ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 miễn trừ chỉ được lập chỉ mục các trường bắt buộc đối với truy vấn của bạn. 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 khả năng ghi hiệu suất.

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 đồ, trường phụ kế thừa các cài đặt đó. Tuy nhiên, bạn có thể xác định chỉ mục một trường trường hợp miễn trừ 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ụ, trường phụ sẽ kế thừa cài đặt miễn trừ của trường gốc, nếu có hoặc cài đặt trên toàn cơ sở dữ liệu nếu không có quy định miễn trừ gốc.

Để 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 Quản lý chỉ mục.

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ả 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ư thế này đối với các chỉ mục trường đơn vì số lượng lớn trường có thể kết hợp. Thay vào đó, Cloud Firestore sẽ giúp bạn xác định và tạo chỉ mục tổng hợp bắt buộc khi bạn tạo ứ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 một đường liên kết mà bạn có thể truy cập vào để tạo dữ liệu bị thiếu chỉ mục.

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 bằng cách dùng Firebase Giao diện dòng lệnh (CLI). Để 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 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 một 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 mà 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 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. Một 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 lên Hỗ trợ <, <=, ==, >=, >, !=, innot-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 <, <=, ==, >=, >, !=, innot-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-containsarray-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. Tôi đã biết làm phạm vi truy vấn của chỉ mục:

Phạm vi thu thập
Cloud Firestore tạo 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 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. Người nhận chạy truy vấn nhóm bộ sưu tập trả về đã lọc hoặc kết quả được sắp xếp theo thứ tự từ một nhóm bộ sưu tập, bạn phải tạo một nhóm chỉ mục ở phạm vi nhóm thu thập.

Thứ tự mặc định và trường __name__

Ngoài việc sắp xếp tài liệu theo chế độ lập chỉ mục được chỉ định cho mỗi trường (tăng dần hoặc giảm dần) , chỉ mục sẽ áp dụng giá trị sắp xếp theo trường __name__ của mỗi tài liệu. Giá trị của __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 nhóm kết quả có các giá trị trường giống nhau đượ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 cuối cùng trường được sắp xếp 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ố 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 phải tạo chỉ mục đó.

Tài sản chỉ mục

Chỉ mục cho phép truy vấn được thực thi hiệu quả nhất được xác định bởi 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ộ lọc bất đẳng thức)

Cloud Firestore tính toán kết quả cho các truy vấn như sau:

  1. 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.
  2. Xác định vị trí chỉ mục mà từ đó quá trình quét bắt đầu. Vị trí bắt đầu có tiền tố là bộ lọc đẳng thức của truy vấn và kết thúc bằng bộ lọc dải ô và bộ lọc bất đẳng thức trên trường orderBy đầu tiên.
  3. 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 các thao tác sau:
    • 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.
    • Đế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ề 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 các giá trị của trường và các đối tượng 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 hoạ, hãy xem xét các ví dụ sau từ quan điểm của tạo chỉ mục. Đoạn mã sau đây sẽ tạo một một số tài liệu city trong bộ sưu tập cities và tập hợp name, state, Các trường 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ử chế độ cài đặt tự động lập chỉ mục 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 chỉ mục trường cho mỗi trường không phải mảng và một chỉ mục mảng chứa chỉ mục trường đơn cho trường mảng. Mỗi hàng trong bảng sau thể hiện một mục trong một 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ố 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 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 bạn 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ợ truy vấn phức hợp chưa được chỉ mục một trường hỗ trợ. Ví dụ: bạn sẽ cần 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 bằng (== hoặc in) cho trường country, bạn có thể sử dụng chế độ lập 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ùng một truy vấn nhưng có thứ tự sắp xếp giảm dần, bạn cần 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")
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

Để tránh làm giảm hiệu suất do hợp nhất chỉ mục, bạn nê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 điều khoản 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 bộ sưu tập, hãy thêm một Tập hợp con landmarks đối với một số tài liệu trong 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" });

Bằng cách sử dụng chỉ mục một trường đơn 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:

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"])

Nếu bạn muốn truy vấn các địa danh ở tất cả các thành phố, ví dụ: bạn chạy truy vấn này trên nhóm bộ sưu tập bao gồm tất cả landmarks bộ sưu tập. Bạn cũng phải bật chỉ mục một trường landmarks với 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 truy vấn nhóm bộ sưu tập trả về đã lọc hoặc kết quả được sắp xếp theo thứ tự, bạn phải bật trường đơn hoặc kết hợp tương ứng chỉ mục ở phạm vi nhóm thu thập. Các truy vấn nhóm bộ sưu tập không lọc hoặc kết quả đơn đặt hàng, 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 đâ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 được định 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 các chỉ mục được định cấu hình số lượng mục nhập chỉ mục của một 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 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 các mục nhập chỉ mục sau 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: "Downtown"
Mảng vùng lân cận Chứa DESC vùng lân cận: "Downtown"
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 thông tin về cách tính toán kích thước bộ nhớ cho các chỉ mục, hãy xem 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 việc này không nhất thiết phải 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 đẳng thức (==) mệnh đề và mệnh đề orderBy (không bắt buộc), Cloud Firestore có thể sử dụng lại chỉ mục hiện có. Cloud Firestore có thể hợp nhất các chỉ mục để đơn giản bộ lọc đẳng thức để xây dựng chỉ mục tổng hợp cần thiết cho đẳng thức lớn hơn truy vấ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ể sử dụng chỉ mục hợp nhất. Ví dụ: trong 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

Ứng dụng này sử dụng các truy vấn như sau. Ứng dụng sử dụng các tổ hợp của đẳng thức các mệnh đề 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 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 sao Thu 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 bằng cách tận dụng khả năng hợp nhất của Cloud Firestore chỉ mục cho các mệnh đề đẳng thức:

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 thêm thông tin về hạn mức và giới hạn, hãy xem 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

Cấu hình một cấp trường có thể chứa nhiều cấu hình cho cùng một trường. Ví dụ: chính sách 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 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:

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

Để xem cách Cloud Firestore biến một tài liệu và một bộ chỉ mục vào các mục nhập chỉ mục, 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 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 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:

  • Tổng kích thước của các mục trong chỉ mục trong một trường của tài liệu
  • Tổng kích thước của các mục trong chỉ mục tổng hợp của 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 lớn hơn 1500 byte sẽ bị cắt bớt. Cụm từ tìm kiếm liên quan 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à các đường liên kết thông báo lỗi đến quản lý chỉ mục của mình. Tuy nhiên, bạn có thể muốn thêm trường hợp miễn trừ trong một trường 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 bạn không dùng để truy vấn, bạn có thể cắt giảm chi phí lưu trữ bằng cách loại trừ trường này khỏi quá trình lập chỉ mục.

    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 tài liệu trong một tập hợp, chẳng hạn như dấu thời gian, sau đó là tốc độ ghi tối đa vào 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ự, thì bạn có thể miễn trừ trường này khỏi lập chỉ mục để 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 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ỷ lệ lưu lượng truy cập cao hơn. Phương pháp hay nhất là thêm 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 sử 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 phần lập chỉ mục những điểm cần cân nhắc mà bạn nên cân nhắc để tối ưu hoá hiệu suất và chi phí của Cloud Firestore truy vấn

    Để biết thêm thông tin về cách khắc phục các vấn đề liên quan đến việc lập chỉ mục (index fanout, lỗi INVALID_ARGUMENT), hãy xem trang khắc phục sự cố.