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. Tương tự như chỉ mục của một cuốn sách liên kết các chủ đề trong sách với số trang, chỉ mục cơ sở dữ liệu liên kết các mục 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 một cơ sở dữ liệu, 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ả hai loại chỉ mục mà Cloud Firestore sử dụng, đó là chỉ mục tự động và chỉ mục thủ công.

Định nghĩa và cấu trúc chỉ mục

Chỉ mục được xác định trên danh sách các 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 chỉ mục. Chỉ mục bao gồm tất cả tài liệu có thể là kết quả 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 nếu tài liệu đó có một giá trị được lập chỉ mục được đặt cho mọi trường được dùng trong chỉ mục. Nếu định nghĩa chỉ mục tham chiếu đến một trường mà tài liệu không có giá trị nào được đặt, thì 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 đượ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 đằng sau mỗi cụm từ tìm kiếm

Nếu không có chỉ mục nào cho một truy vấn, thì 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, một quy 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 giúp mang lại 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 kết quả chứ không phụ thuộc vào số lượng mục trong cơ sở dữ liệu.

Ít quản lý chỉ mục hơn, phát triển ứng dụng nhiều hơn

Cloud Firestore có các tính năng giúp giảm 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 những 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 sẽ giúp bạn xác định và tạo thêm các 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: tự động và thủ công. Chỉ mục thủ công và chỉ mục tự động khác nhau ở cách bạn quản lý chúng.

Chỉ mục tự động

Theo mặc định, Cloud Firestore sẽ tự động tạo chỉ mục cho từng trường có trong tài liệu của một tập hợp. Các chỉ mục trường đơn này cho phép bạn thực hiện nhiều truy vấn cơ bản. Bạn quản lý chỉ mục tự động bằng cách định cấu hình chế độ cài đặt lập chỉ mục tự động và các trường hợp miễn lập chỉ mục của cơ sở dữ liệu.

Chế độ mặc định của chỉ mục tự động

Cloud Firestore sử dụng các chế độ cài đặt mặc định sau đây cho chỉ mục tự động:

  • Đố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 phạm vi tập hợp, một chỉ mục ở chế độ tăng dần và một chỉ mục ở 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 tập hợ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 trong phạm vi tập hợp cho mỗi trường con không phải mảng, không phải bản đồ.
    • Một chỉ mục tăng dần trong phạm vi tập hợp cho toàn bộ giá trị bản đồ
    • Một chỉ mục giảm dần trong phạm vi tập hợp cho toàn bộ giá trị bản đồ
    • Một chỉ mục array-contains 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 cho từng trường con của bản đồ.
  • Đối với mỗi trường mảng trong một tài liệu, Cloud Firestore sẽ tạo những mục sau:

    • Một chỉ mục tăng dần trong phạm vi tập hợp cho toàn bộ giá trị mảng
    • Một chỉ mục giảm dần trong phạm vi tập hợp cho toàn bộ giá trị mảng
    • Một chỉ mục array-contains trong phạm vi tập hợp.
  • Theo mặc định, các chỉ mục tự động có phạm vi nhóm tập hợp sẽ không được duy trì.

Miễn trừ lập chỉ mục tự động

Bạn có thể miễn trừ một trường khỏi chế độ cài đặt lập chỉ mục tự động bằng cách tạo một trường hợp miễn trừ lập chỉ mục. Trường hợp miễn lập chỉ mục sẽ ghi đè chế độ cài đặt chỉ mục tự động trên toàn cơ sở dữ liệu. Trường hợp miễn trừ có thể bật một chỉ mục mà chế độ cài đặt lập chỉ mục tự động của bạn sẽ tắt hoặc tắt một chỉ mục mà chế độ lập chỉ mục tự động sẽ bật. Để biết các trường hợp có thể áp dụng quy tắc miễn trừ, hãy xem các phương pháp hay nhất về việc 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 tập hợp trên tất cả các trường trong một nhóm tập hợp. Ví dụ: đối với nhóm tập hợ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 tập hợp comments và tắt tính năng lập chỉ mục tất cả các trường trong nhóm tập hợp. Sau đó, bạn có thể thêm các trường hợp miễn trừ để chỉ lập chỉ mục các trường cần thiết cho truy vấn của mình. 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 một trường hợp miễn trừ chỉ mục 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 các trường hợp miễn lập chỉ mục cho các trường con cụ thể. Nếu bạn xoá một 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 mẹ (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ừ nào của trường mẹ.

Để tạo và quản lý các trường hợp miễn trừ chỉ mục tự động, hãy xem phần Quản lý chỉ mục.

Chỉ mục thủ công

Chỉ mục thủ công lưu trữ mối liên kết đượ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 theo thứ tự của các trường để lập chỉ mục.

Cloud Firestore sử dụng chỉ mục thủ công để hỗ trợ các truy vấn chưa được chỉ mục tự động hỗ trợ.

Theo mặc định, Cloud Firestore sẽ tự động tạo chỉ mục trường đơn cho mỗi trường có trong một tập hợp. Cloud Firestore không tự động tạo chỉ mục cho các tổ hợp trường vì có quá 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 bắt buộc khi bạn 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 hiện 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 theo cách thủ công bằng cách sử dụng bảng điều khiển hoặc Giao diện dòng lệnh (CLI) của Firebase. Để biết thêm thông tin về cách tạo và quản lý chỉ mục thủ công, hãy xem bài viết 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 tự động và thủ công theo cách 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 xác định một chỉ mục, bạn sẽ chọn một chế độ chỉ mục cho mỗi trường được lập chỉ mục. Mỗi 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 dần Hỗ trợ các mệnh đề truy vấn <, <=, ==, >=, >, !=, in và not-in trên trường này, đồng thời hỗ trợ sắp xếp kết quả theo thứ tự tăng dần dựa trên giá trị của 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 này, đồ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ị của trường này.
Array‑contains Hỗ trợ các mệnh đề truy vấn array-contains và array-contains-any trên trường.
Vector 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 được đặt trong phạm vi của một tập hợp hoặc một nhóm tập hợp. Đâ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 sẽ tạo chỉ mục có phạm vi tập hợp. Các chỉ mục này hỗ trợ những truy vấn trả về kết quả từ một tập hợp duy nhất.

Phạm vi nhóm bộ sưu tập
Một nhóm tập hợp bao gồm tất cả các tập hợp có cùng mã nhận dạng tập hợp. Để chạy một truy vấn nhóm tập hợp trả về kết quả được lọc hoặc sắp xếp theo thứ tự từ một nhóm tập hợp, bạn phải tạo một chỉ mục tương ứng với phạm vi nhóm tập hợ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) , 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 với trường được sắp xếp gần đây nhất trong định nghĩa chỉ mục. Ví dụ:

Thu thập Số trường được lập chỉ mục Phạm vi truy vấn
thành phố name, __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 đó.

Thuộc tính chỉ mục

Chỉ mục cho phép thực thi truy vấn hiệu quả nhất được xác định bằng các thuộc tính sau:

  • Các trường được dùng trong bộ lọc bằng
  • Các trường được dùng trong thứ tự sắp xếp
  • Các trường được dùng trong bộ lọc dải ô và bất đẳng thức (chưa có 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, bộ lọc phạm vi 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ử bộ lọc và thứ tự sắp xếp của truy vấn.
  2. Xác định vị trí chỉ mục mà quá trình quét bắt đầu. Vị trí bắt đầu có tiền tố là bộ lọc bằng của truy vấn và kết thúc bằng bộ lọc dải ô và 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 những thao tác sau:
    • Gặp một 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ề việc 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 giá trị trường và các toán tử so sánh <, <=, ==, >=, > và in. Đối với các trường mảng, các chỉ mục này cho phép bạn thực hiện truy vấn array-contains và array-contains-any.

Để minh hoạ, hãy xem xét các ví dụ sau đây theo quan điểm tạo chỉ mục. Đoạn mã sau đây tạo một vài tài liệu city trong tập hợp cities và đặt các trường name, state, country, capital, population và regions 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 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, một chỉ mục trường đơn giảm dần cho mỗi trườ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 đây đại diện cho một mục nhập trong 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ố 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ố vùng Thu thập
thành phố Tên Thu thập
thành phố 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ố vùng Thu thập
thành phố array-contains vùng Thu thập

Các truy vấn được chỉ mục một trường hỗ trợ

Khi 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 truy vấn in và truy vấn bằng nhau 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 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 cần sắp xếp theo một trường khác, bạn phải tạo một chỉ mục thủ công 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"])

Các truy vấn được hỗ trợ bởi chỉ mục thủ công

Tạo chỉ mục thủ công để hỗ trợ các truy vấn phức hợp chưa được chỉ mục trường đơn tự động hỗ trợ. Ví dụ: bạn cần có chỉ mục thủ công 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 sau. Vì truy vấn sử dụng phép so sánh bằng (== 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.

Thu thập Số 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 theo thứ tự sắp xếp giảm dần, bạn cần có thêm một chỉ mục 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 Số 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 mất hiệu suất do hợp nhất chỉ mục, bạn nên tạo một chỉ mục để 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 Số trường được lập chỉ mục Phạm vi truy vấn
thành phố Thẻ array-contains, thủ đô (hoặc ) Thu thập

Các truy vấn được hỗ trợ bởi chỉ mục nhóm tập hợp

Để minh hoạ một chỉ mục có phạm vi nhóm tập hợp, hãy 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 trường đơn sau đây với phạm vi tập hợ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 Số 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"])

Ví dụ: nếu muốn truy vấn các địa danh trên tất cả thành phố, bạn sẽ chạy truy vấn này trên nhóm tập hợp bao gồm tất cả tập hợp landmarks. Bạn cũng phải bật một landmarks chỉ mục trường đơn có phạm vi nhóm tập hợp:

Thu thập Số trường được lập chỉ mục Phạm vi truy vấn
địa danh Danh mục (hoặc ) Nhóm bộ sưu tập

Khi bật chỉ mục này, bạn có thể truy vấn nhóm tập hợ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 tập hợp trả về kết quả được lọc hoặc sắp xếp, bạn phải bật một chỉ mục tương ứng với phạm vi nhóm tập hợp. Tuy nhiên, các truy vấn nhóm tập hợ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 tập hợ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 nhập chỉ mục cho một tài liệu. 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 đây 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 tự động

  • city_name ASC
  • city_name DESC
  • khu vực lân cận ASC
  • neighborhoods DESC
  • nhiệt độ ASC
  • temperatures DESC
  • temperatures.summer ASC
  • temperatures.summer DESC
  • temperatures.winter ASC
  • temperatures.winter DESC
  • neighborhoods Array Contains

Chỉ mục thủ công

  • city_name ASC, neighborhoods ARRAY
  • city_name DESC, neighborhoods 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 đây cho tài liệu:

Chỉ mục Dữ liệu được lập chỉ mục
Mục nhập chỉ mục tự động
city_name ASC city_name: "San Francisco"
city_name DESC city_name: "San Francisco"
khu vực lân cận ASC neighborhoods: ["Mission", "Downtown", "Marina"]
neighborhoods DESC neighborhoods: ["Mission", "Downtown", "Marina"]
nhiệt độ ASC temperatures: {summer: 67, winter: 55}
temperatures DESC temperatures: {summer: 67, winter: 55}
temperatures.summer ASC temperatures.summer: 67
temperatures.summer DESC temperatures.summer: 67
temperatures.winter ASC temperatures.winter: 55
temperatures.winter DESC temperatures.winter: 55
neighborhoods Array Contains khu lân cận: "Mission"
neighborhoods Array Contains neighborhoods: "Downtown"
neighborhoods Array Contains khu lân cận: "Marina"
Mục nhập chỉ mục thủ công
city_name ASC, neighborhoods ARRAY city_name: "San Francisco", neighborhoods: "Mission"
city_name ASC, neighborhoods ARRAY city_name: "San Francisco", neighborhoods: "Downtown"
city_name ASC, neighborhoods ARRAY city_name: "San Francisco", neighborhoods: "Marina"
city_name DESC, neighborhoods ARRAY city_name: "San Francisco", neighborhoods: "Mission"
city_name DESC, neighborhoods ARRAY city_name: "San Francisco", neighborhoods: "Downtown"
city_name DESC, neighborhoods ARRAY city_name: "San Francisco", neighborhoods: "Marina"

Chỉ số và giá

Chỉ mục góp phần vào chi phí lưu trữ của ứng dụng. Để biết thêm thông tin về cách tính kích thước bộ nhớ cho chỉ mục, hãy xem phần 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 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 đề bằng nhau (==) 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 bộ lọc bằng đơn giản để tạo các chỉ mục cần thiết cho truy vấn bằng 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 trường hợp có thể sử dụng tính năng hợp nhất chỉ mục. Ví dụ: trong một tập hợp restaurants cho ứng dụng xếp hạng nhà hàng:

  • nhà hàng

    • burgerthyme

      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 kết hợp các mệnh đề bằng nhau cho category, city và editors_pick trong khi luôn sắp xếp theo thứ tự tăng dần star_rating:

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 một chỉ mục cho mỗi truy vấn:

Thu thập Số trường được lập chỉ mục Phạm vi truy vấn
nhà hàng category, star_rating Thu thập
nhà hàng city, star_rating Thu thập
nhà hàng category, city, star_rating Thu thập
nhà hàng category, city, editors_pick, star_rating Thu thập

Một giải pháp tốt 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 chỉ mục của Cloud Firestore cho các mệnh đề bằng nhau:

Thu thập Số trường được lập chỉ mục Phạm vi truy vấn
nhà hàng category, star_rating Thu thập
nhà hàng city, star_rating Thu thập
nhà hàng editors_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ợ thêm một truy vấn:

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 thêm thông tin về 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 kết hợp tối đa cho một cơ sở dữ liệu
Số lượng cấu hình trường đơn 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ụ: một trường hợp miễn lập chỉ mục cho một trường và một 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 trong hạn mức.

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 các mục sau đây cho một tài liệu:

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

Để xem cách Cloud Firestore biến một tài liệu và một tập hợp chỉ mục thành các mục chỉ mục, hãy xem ví dụ về số lượng mục chỉ mục này.

Số trường tối đa trong một chỉ mục kết 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 phần 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 một tài liệu

8 MiB

Tổng kích thước là tổng của các giá trị sau đây cho một tài liệu:

  • Tổng kích thước của các mục nhập chỉ mục trường đơn của một tài liệu
  • Tổng kích thước của các mục chỉ mục kết 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

    Giá trị trường vượt quá 1.500 byte sẽ 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.

    Các phương pháp hay nhất về việc lập chỉ mục

    Đố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 đường liên kết đến 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 lập chỉ mục tự động trong những trường hợp sau:

    Cách Mô tả
    Trường chuỗi lớn

    Nếu 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ể 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 tập hợ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 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 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 tập hợ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ượt 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. 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 khi lưu lượng truy cập cao hơn. Phương pháp hay nhất là thêm các trường hợp miễn lập chỉ mục tự động cho các trường TTL.

    Các 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 đến giới hạn 40.000 mục nhập chỉ mục cho mỗi tài liệu. Nếu không truy vấn dựa trên một trường mảng hoặc bản đồ lớn, bạn nên miễn lập chỉ mục cho trường đó.

    Nếu bạn đang sử dụng 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 lưu ý khi lập chỉ mục để tối ưu hoá hiệu suất và chi phí của truy vấn Cloud Firestore.

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