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 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ườngchỉ 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-fieldcomposite. 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ợ <, <=, ==, >=, >, !=, 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. 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ố tiểu bang, __name__ Thu thập
thành phố quốc gia, dân số, __name__ Thu thập

Để sắp xếp kết quả theo hướng __name__ không mặc định, bạn cần tạo chỉ mục đó.

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:

  1. Các trường được sử dụng trong bộ lọc đẳng thức
  2. Các trường được dùng trong thứ tự sắp xếp
  3. 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)
  4. 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:

  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 để 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
  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 chỉ mục:
    1. 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
    2. đến cuối chỉ mục, hoặc
    3. đã 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 <, <=, ==, >=, >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-containsarray-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, 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á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, 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 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:

  • 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 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:

  • 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 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ố.