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 cuốn 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 các mục đó trong cơ sở dữ liệu. Khi bạn truy vấn 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 trường đơnchỉ mục tổng hợp.

Định nghĩa và cấu trúc của 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 tên trong định nghĩa chỉ mục. 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 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 sử 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 đặt giá trị, 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 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.

Một chỉ mục đằng sau mỗi truy vấn

Nếu không có chỉ mục nào cho một truy vấn, hầu hết các cơ sở dữ liệu sẽ thu thập thông tin qua từng mục nội dung, một quá trình chậm và càng 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ả 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 phải quản lý chỉ mục hơn, tập trung nhiều hơn vào việc phát triển ứng dụng

Cloud Firestore bao gồm 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 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 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: một trườngkết hợp. 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 chỉ mục đó.

Chỉ mục một trường

Chỉ mục một trường lưu trữ mối liên kết đã sắp xếp của tất cả tài liệu trong một tập hợ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 chế độ cài đặt lập chỉ mục tự động và các trường được miễn lập 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 trường đơn cho mỗi trường trong tài liệu và mỗi trường con trong 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 phải mảng và không phải bản đồ, Cloud Firestore xác định hai chỉ mục trường đơn 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 các trường sau:

    • Một chỉ mục tăng dần trong phạm vi tập hợp cho mỗi trường phụ 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 phụ không phải mảng, không phải bản đồ.
    • Một chỉ mục mảng-chứa phạm vi tập hợp cho mỗi trường con 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 một tài liệu, Cloud Firestore sẽ tạo và duy trì chỉ mục chứa mảng trong phạm vi tập hợp.

  • Theo mặc định, các chỉ mục một trường có phạm vi nhóm bộ sưu tập sẽ không được duy trì.

Trường hợp miễn trừ chỉ mục trường đơn

Bạn có thể miễn một trường khỏi chế độ cài đặt tự động lập chỉ mục bằng cách tạo trường miễn 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. Một trường hợp 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 sẽ tắt hoặc tắt chỉ mục một trường mà chế độ lập chỉ mục tự động sẽ bật. Đối với các trường hợp có thể áp dụng trường hợp ngoại lệ, 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 bộ sưu tập trên tất cả các trường trong một 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 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 sẽ làm 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 miễn lập 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 trừ chỉ mục trường đơn cho các trường con cụ thể. Nếu bạn xoá một trường hợp ngoại lệ cho trường con, thì trường con đó sẽ kế thừa chế độ cài đặt trường hợp ngoại lệ 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 ngoại lệ nào của trường mẹ.

Để tạo và quản lý trường hợp ngoại lệ về chỉ mục một trường, hãy xem phần Quản lý chỉ mục.

Chỉ mục tổng hợp

Chỉ mục tổng hợp lưu trữ mối liên kết đã 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 để 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 chỉ mục tổng hợp như đối với chỉ mục một trường do có nhiều tổ hợp trường có thể có. Thay vào đó, Cloud Firestore giúp bạn xác định và tạo các chỉ mục tổng hợp bắt buộc khi xây dựng ứng dụng.

Bất cứ khi nào bạn 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 để tạo chỉ mục bị thiếu.

Bạn cũng có thể xác định và quản lý các chỉ mục tổng hợp theo cách thủ công bằng cách sử dụng bảng điều khiển hoặc bằng cách sử dụng CLI của Firebase. Để biết thêm về cách 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ế độ lập 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 định cấu hình chế độ chỉ mục và phạm vi truy vấn cho các 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 chế độ 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ế độ chỉ mục sau:

Chế độ chỉ mục Mô tả
Tăng dầ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.
Array‑contains Hỗ trợ mệnh đề truy vấn array-containsarray-contains-any trên trường.
Vectơ Hỗ trợ 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 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 bộ sưu tập
Cloud Firestore tạo các chỉ mục có phạm vi tập hợ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 bộ sưu tập
Nhóm bộ sưu tập bao gồm tất 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ả đã lọc hoặc đã sắp xếp từ một nhóm bộ sưu tập, bạn phải tạo một chỉ mục tương ứng 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 chế độ chỉ mục được chỉ định cho mỗi trường (tăng dần hoặc giảm dần) , các chỉ mục sẽ áp dụng một lần 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 tập hợ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 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ố Trạng thái , __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 phải 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 một cách 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 nhau
  • 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 phạm vi và bộ lọc bất đẳng thức (chưa có trong thứ tự sắp xếp)
  • Các trường được dùng trong phép tổng hợp (chưa có trong 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 bắt đầu quét. Vị trí bắt đầu được đặt tiền tố là bộ lọc bằng của truy vấn và kết thúc bằng bộ lọc phạm vi và bộ lọc không bằng 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ả 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 điều kiện của bộ 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 đủ điều kiện của bộ 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 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 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 giá trị trường và trình 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 đây từ quan điểm tạo chỉ mục. Đoạn mã sau đây tạo một số tài liệu city trong một 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 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 một chỉ mục một trường:

Thu thập Trường được lập chỉ mục Phạm vi truy vấn
thành phố Tên Thu thập
thành phố Trạng thái Thu thập
thành phố quốc gia Thu thập
thành phố viết hoa Thu thập
thành phố dân số Thu thập
thành phố Tên Thu thập
thành phố Trạng thái Thu thập
thành phố quốc gia Thu thập
thành phố viết hoa Thu thập
thành phố dân số Thu thập
thành phố Khu vực array-contains 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 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 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"])

Các 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 phức hợp mà chỉ mục trường đơn không 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)

Các truy vấn này yêu cầu chỉ mục tổng hợp dưới đây. Vì truy vấn sử dụng toán tử 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, 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 theo thứ tự sắp xếp giảm dần, bạn cần thêm một 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ố country, population Thu thập

Để tránh bị giảm hiệu suất do hoạt động hợp nhất chỉ mục, bạn nên tạo một 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, viết hoa (hoặc ) Thu thập

Các truy vấn được chỉ mục nhóm bộ sưu tậ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 bộ sưu tập phụ 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 sau đây với phạm vi bộ sưu tập, bạn có thể truy vấn bộ sưu tập landmarks của một thành phố dựa trên trường category:

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

Ví dụ: nếu muốn truy vấn các địa danh trên tất cả các thành phố, bạn có thể chạy truy vấn này trên nhóm tập hợp bao gồm tất cả các tập hợp landmarks. Bạn cũng phải bật chỉ mục trường đơn landmarks với phạm vi nhóm tập hợ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 bộ sưu tậ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ề kết quả đã được lọc hoặc sắp xếp, bạn phải bật chỉ mục đơn trường hoặc chỉ mục tổng hợp tương ứng có 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 bộ sưu tập sau đây mà không cần bật thêm chỉ mục:

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

Mục nhập chỉ mục

Các chỉ mục đã định cấu hình của dự án và cấu trúc của tài liệu xác định số mục nhập chỉ mục cho tài liệu. Mục nhập chỉ mục được tính vào giới hạn số 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 một trường

  • city_name ASC
  • city_name DESC
  • temperatures.summer ASC
  • temperatures.summer DESC
  • temperatures.winter ASC
  • temperatures.winter DESC
  • Mảng neighborhoods Có chứa (ASC và DESC)

Chỉ mục tổng hợp

  • 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 sẽ tạo ra các mục chỉ mục sau cho tài liệu:

Chỉ mục Dữ liệu được lập chỉ mục
Mục nhập chỉ mục một trường
city_name ASC city_name: "San Francisco"
city_name DESC city_name: "San Francisco"
temperatures.summer ASC temperatures.summer: 67
temperatures.summer DESC temperatures.summer: 67
temperatures.winter ASC temperatures.winter: 55
temperatures.winter DESC temperatures.winter: 55
Mảng neighborhoods Chứa ASC khu vực lân cận: "Mission"
Mảng neighborhoods có chứa DESC khu vực lân cận: "Mission"
Mảng neighborhoods Chứa ASC khu vực lân cận: "Downtown"
Mảng neighborhoods có chứa DESC khu vực lân cận: "Downtown"
Mảng neighborhoods Chứa ASC khu vực lân cận: "Marina"
Mảng neighborhoods có chứa DESC khu vực lân cận: "Marina"
Mục nhập chỉ mục tổng hợp
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ỉ mục 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 dung lượng 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à tuỳ ý có mệnh đề orderBy, 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 nhau đơn giản để tạo 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 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 các tổ hợp mệnh đề bằng nhau cho category, cityeditors_pick, đồng thời 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 Các 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

Để có 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 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 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

Bộ 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 đâ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 bài viết 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 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 trừ lập chỉ mục 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 đối với hạn mức.

Số mục 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 đây đối với một tài liệu:

  • Số mục nhập chỉ mục một trường
  • Số 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 tập hợp các chỉ mục thành mục nhập chỉ mục, hãy xem ví dụ về số 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ụ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 thành phần sau đây đối với một tài liệu:

  • Tổng kích thước của các mục 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 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

    1.500 byte

    Các giá trị trường trên 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 để 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 thông báo lỗi để quản lý chỉ mục. Tuy nhiên, bạn nên thêm trường miễn trừ đơn lẻ trong các 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 sử dụng để truy vấn, bạn có thể giảm chi phí lưu trữ bằng cách miễn trường đó khỏi việc lập chỉ mục.

    Tốc độ 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 trường này để 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. Theo mặc định, tính năng lập chỉ mục trên các trường TTL sẽ được bật và có thể ảnh hưởng đến hiệu suất ở tốc độ lưu lượng truy cập cao hơn. Phương pháp hay nhất là thêm trường miễn trừ một trường cho các trường TTL.

    Các trường bản đồ hoặc mảng 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 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 bản đồ, bạn nên loại trừ trường đó khỏi việc lập chỉ mục.

    Nếu bạn đang sử dụng các truy vấn có toán tử phạm vi và toán tử bất đẳng thức trên nhiều trường, hãy xem các điều cần cân nhắc về việc lập chỉ mục mà bạn nên cân nhắc để tối ưu hoá hiệu suất và chi phí của các truy vấ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 (lỗi phân tán chỉ mục, lỗi INVALID_ARGUMENT), hãy xem trang khắc phục sự cố.