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 giúp liên kết các chủ đề trong sách với số trang, chỉ mục cơ sở dữ liệu giúp 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 một 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, đó là chỉ mục một trường và chỉ mục kết hợp.
Đị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 tên trong định nghĩa chỉ mục. Chỉ mục này 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. 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 đề cập đến một trường mà tài liệu không có giá trị đượ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 kết 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 đằng sau mỗi truy vấn
Nếu không có chỉ mục cho một truy vấn, hầu hết các cơ sở dữ liệu sẽ thu thập thông tin nội dung theo từng mục, đây là một quy trình chậm và sẽ 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ả cá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.
Giảm việc quản lý chỉ mục, tăng 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 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.
Các loại chỉ mục
Cloud Firestore sử dụng hai loại chỉ mục: trường đơn và hỗn hợp. Ngoài số lượng trường được lập chỉ mục, chỉ mục một trường và chỉ mục kết hợp còn khác nhau về cách bạn quản lý chúng.
Chỉ mục một trường
Chỉ mục một trường lưu trữ một ánh xạ đã sắp xếp của tất cả các tài liệu trong một tập hợp chứa một trường cụ thể. Mỗi mục trong một 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 hợp ngoại lệ về 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ì các chỉ mục một trường cho mỗi trường trong một tài liệu và mỗi trường con trong một bản đồ. Cloud Firestore sử dụng các chế độ cài đặt mặc định sau cho chỉ mục một trường:
Đối với mỗi trường không phải là mảng và không phải là bản đồ, Cloud Firestore sẽ xác định hai chỉ mục phạm vi tập hợp một trường, 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 sẽ tạo ra những nội dung sau:
- Một chỉ mục tăng dần ở 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 ở phạm vi bộ sưu tập cho mỗi trường phụ không phải mảng, không phải bản đồ.
- Một chỉ mục array-contains ở phạm vi tập hợp cho mỗi trường con mảng.
- Cloud Firestore sẽ lập chỉ mục đệ quy cho từng trường con trên 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ì một chỉ mục array-contains ở phạm vi bộ sưu tập.
Theo mặc định, các chỉ mục một trường có phạm vi nhóm tập hợp sẽ không được duy trì.
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 lập chỉ mục tự động bằng cách tạo một chế độ miễn trừ chỉ mục một trường. Ngoại lệ lập chỉ mục sẽ ghi đè chế độ cài đặt chỉ mục tự động trên toàn bộ cơ sở dữ liệu. Một trường hợp ngoại lệ có thể cho phép một chỉ mục một trường mà chế độ cài đặt lập chỉ mục tự động của bạn sẽ vô hiệu hoá hoặc vô hiệu hoá một chỉ mục một trường mà chế độ lập chỉ mục tự động sẽ cho phép. Đối với những trường hợp có thể sử dụng các trường hợp ngoại lệ, 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 ngoại lệ về 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 tập hợp comments
, hãy đặt đường dẫn trường thành *
để so khớp 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 của 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 ngoại lệ để chỉ lập chỉ mục những trường cần thiết cho các truy vấn của mình. Việc giảm số lượng trường được lập chỉ mục sẽ 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 chế độ miễn trừ 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 những chế độ cài đặt đó. Tuy nhiên, bạn có thể xác định các trường hợp ngoại lệ về chỉ mục một trường cho các trường con cụ thể. Nếu bạn xoá một trường hợp ngoại lệ cho một trường con, thì trường con đó sẽ kế thừa chế độ cài đặt 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ý các 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 kết hợp lưu trữ một mối 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, 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 kết hợp để hỗ trợ các truy vấn chưa được chỉ mục một trường hỗ trợ.
Cloud Firestore không tự động tạo chỉ mục kết hợp như đối với chỉ mục một trường do có số lượng lớn các tổ hợp trường có thể có. Thay vào đó, Cloud Firestore sẽ giúp bạn xác định và tạo các chỉ mục kết 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 để tạo chỉ mục bị thiếu.
Bạn cũng có thể xác định và quản lý chỉ mục kết hợp theo cách thủ công bằng cách sử dụng bảng điều khiển hoặc Firebase CLI. Để biết thêm thông tin về cách tạo và quản lý chỉ mục kết 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 có thể định cấu hình chỉ mục một trường và chỉ mục kết 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 chỉ mục.
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 từng trường được lập chỉ mục. Chế độ chỉ mục của mỗi trường hỗ trợ các mệnh đề truy vấn cụ thể trên trường đó. Bạn có thể chọn trong số các chế độ lập chỉ mục sau:
Chế độ chỉ mục | Mô tả |
---|---|
Tăng dần | Hỗ trợ < , <= , == , >= , > , != , in và not-in , 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 < , <= , == , >= , > , != , 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ị 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 giới hạn trong một bộ sưu tập hoặc một nhóm bộ sưu tập. Đây được gọi là phạm vi truy vấn của chỉ mục:
- Phạm vi thu thập Theo mặc định,
- Cloud Firestore sẽ tạo các chỉ mục có phạm vi thu thậ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 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 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 có 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 các chế độ lập 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 sẽ áp dụng một 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 tập kết quả có cùng giá trị trường sẽ được sắp xếp theo đường dẫn tài liệu.
Theo mặc định, trường __name__
được sắp xếp theo cùng hướng với trường được sắp xếp 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ố | __name__ |
tên, Thu thập |
thành phố | __name__ |
tiểu bang, Thu thập |
thành phố | __name__ |
quốc gia, dân số, 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
Một chỉ mục cho phép truy vấn được thực thi 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ình đẳ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 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 hoạt động tổng hợp (chưa có trong thứ tự sắp xếp và bộ lọc phạm vi cũng như bộ lọc bất đẳng thức)
Cloud Firestore tính toán kết quả cho các cụm từ tìm kiếm như sau:
- 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.
- 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à các bộ lọc bình đẳng của truy vấn và kết thúc bằng các bộ lọc phạm vi và bất bình đẳng trên trường
orderBy
đầu tiên. - 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 quy trình quét thực hiện một trong các thao tác sau:
- Gặp phải 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.
- Đạt đế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 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à các bộ so sánh <
, <=
, ==
, >=
, >
và 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-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 số tài liệu city
trong một tập hợp cities
và đặt các trường name
, state
, country
, capital
, population
và tags
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 tăng dần gồm một trường cho mỗi trường không phải là mảng, một chỉ mục giảm dần gồm một trường cho mỗi trường không phải là mảng và một chỉ mục array-contains gồm một trường cho trường mảng. Mỗi hàng trong bảng sau đây thể hiện một mục trong 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ố | tiểu bang | Thu thập |
thành phố | quốc gia | Thu thập |
thành phố | chữ 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ố | chữ hoa | Thu thập |
thành phố | dân số | Thu thập |
thành phố | array-contains khu vực |
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 các truy vấn in
và truy vấn về sự bình đẳng phức tạ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 kết hợp sử dụng phép so sánh theo 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 kết 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 kết hợp hỗ trợ
Cloud Firestore sử dụng chỉ mục kết hợp để hỗ trợ các truy vấn kết hợp chưa được chỉ mục một trường hỗ trợ. Ví dụ: bạn sẽ cần một chỉ mục kết 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 kết hợp bên dưới. Vì truy vấn sử dụng một đẳng thức (==
hoặc in
) cho trường country
, nên bạn có thể sử dụng chế độ chỉ mục tăng dần hoặc giảm dần cho trường này. Theo mặc định, các mệnh đề bất đẳng thức sẽ á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ó một chỉ mục kết 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ố | country, population | 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 để 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 ) viết hoaThu thập |
Các truy vấn được chỉ mục nhóm tập hợ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 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 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 bạn muốn truy vấn các địa danh ở tất cả cá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ả các tập hợp landmarks
. Bạn cũng phải bật chỉ mục một trường landmarks
có 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 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 gồm một trường hoặc chỉ mục kết hợp có phạm vi nhóm tập hợp. Tuy nhiên, những truy vấn nhóm bộ sưu tập không lọc hoặc sắp xếp kết quả sẽ 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
Các chỉ mục đã định cấu hình của dự án và cấu trúc của một tài liệu sẽ xác định số lượng mục nhập chỉ mục cho một tài liệu. Các mục trong chỉ mục được tính vào giới hạn số mục trong chỉ mục.
Ví dụ sau đây minh hoạ các mục chỉ mục của một tài liệu.
Tài liệu
/cities/SF
city_name : "San Francisco"
temperatures : {summer: 67, winter: 55}
neighborhoods : ["Mission", "Downtown", "Marina"]
Chỉ mục một trường
- city_name ASC
- city_name DESC
- temperatures.summer ASC
- temperatures.summer DESC
- temperatures.winter ASC
- temperatures.winter DESC
- khu dân cư Mảng 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 nhập 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 khu dân cư Chứa ASC | khu dân cư: "Mission" |
mảng khu dân cư Chứa DESC | khu dân cư: "Mission" |
mảng khu dân cư Chứa ASC | vùng lân cận: "Trung tâm thành phố" |
mảng khu dân cư Chứa DESC | vùng lân cận: "Trung tâm thành phố" |
mảng khu dân cư Chứa ASC | khu dân cư: "Marina" |
mảng khu dân cư Chứa DESC | khu dân cư: "Marina" |
Mục nhập chỉ mục kết 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 kích thước bộ nhớ cho các 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 đề về tính bằng nhau (==
) và tuỳ ý có một 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 các bộ lọc bình đẳng đơn giản để tạo chỉ mục kết hợp cần thiết cho các truy vấn bình đẳ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 bộ sưu tập restaurants
cho ứng dụng đánh giá 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 này sử dụng các tổ hợp mệnh đề về sự bình đẳng cho category
, city
và editors_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 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 | Danh mục | , star_ratingThu thập |
nhà hàng | thành phố, star_rating | Thu thập |
nhà hàng | danh mục, thành phố, star_rating | Thu thập |
nhà hàng | danh mục, thành phố, lựa_chọn_của_biên_tập_viên, điểm_xếp_hạng_sao | 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 đề về tính bình đẳng:
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 | , star_ratingThu thập |
nhà hàng | thành phố, 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ợ một truy vấn bổ sung:
Web
db.collection("restaurants").where("editors_pick", "==", true) .orderBy("star_rating")
Giới hạn lập chỉ mục
Các giới hạn sau đâ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 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 tối đa cấu hình một trường 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 được miễn lập chỉ mục và một 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 trong hạn mức. |
Số lượng 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 những mục sau đây cho một tài liệu:
Để xem cách Cloud Firestore chuyển đổi 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ố lượng 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 kích thước mục nhập chỉ mục, hãy xem kích thước mục nhập chỉ mục. |
Tổng kích thước tối đa của các mục nhập chỉ mục trong một tài liệu |
8 MiB Tổng kích thước là tổng của những thành phần sau đây đối với 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 có kích thước lớn hơ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 đến thông báo lỗi để quản lý chỉ mục của mình. Tuy nhiên, bạn có thể muốn thêm 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ả |
---|---|
Các 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 chỉ mục cho trường đó. |
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 cho một trường tăng hoặc giảm tuần tự giữa các tài liệu trong một bộ sưu tập, chẳng hạn như dấu thời gian, thì tốc độ ghi tối đa cho bộ sưu tập là 500 lượt ghi mỗi giây. Nếu không truy vấn dựa trên trường có cá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. Trong một trường hợp sử dụng IoT có tốc độ ghi cao, chẳng hạn như một bộ sưu tập chứa các tài liệu có trường dấu thời gian có thể đạt đến giới hạn 500 lượ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 ở tốc độ lưu lượng truy cập cao hơn. Theo phương pháp hay nhất, hãy 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 mảng hoặc bản đồ lớn | Các trường mảng hoặc bản đồ lớn có thể gần đạt đến giới hạn 40.000 mục chỉ mục cho mỗi tài liệu. Nếu không truy vấn dựa trên một mảng hoặc trường bản đồ lớ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ử không bằng 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 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ề lập chỉ mục (lỗi phân tán chỉ mục, INVALID_ARGUMENT
), hãy xem trang khắc phục sự cố.