Để khắc phục sự cố truy vấn chậm, hãy sử dụng Giải thích truy vấn để lấy kế hoạch thực thi truy vấn và hồ sơ thực thi thời gian chạy. Phần sau đây mô tả các bước bạn có thể thực hiện để tối ưu hoá hiệu suất truy vấn tuỳ theo hồ sơ thực thi:
Giới hạn số lượng kết quả
Sử dụng trường bản ghi được trả về trong cây thực thi để xác định xem truy vấn có trả về nhiều tài liệu hay không. Cân nhắc việc giới hạn số lượng tài liệu được trả về bằng cách sử dụng giai đoạn limit(...). Điều này giúp giảm kích thước byte được tuần tự hoá của kết quả khi được trả về cho ứng dụng qua mạng. Trong trường hợp nút Limit được đặt trước nút MajorSort, công cụ truy vấn có thể kết hợp các nút Limit và MajorSort rồi thay thế quá trình hiện thực hoá và sắp xếp đầy đủ trong bộ nhớ bằng quá trình sắp xếp TopN, giúp giảm yêu cầu về bộ nhớ cho truy vấn.
Giới hạn kích thước tài liệu kết quả
Cân nhắc việc giới hạn kích thước của tài liệu được trả về bằng cách sử dụng select(...) để chỉ trả về các trường bắt buộc hoặc remove_fields(...) để loại bỏ các trường quá lớn. Điều này giúp giảm chi phí tính toán và bộ nhớ để xử lý kết quả trung gian cũng như kích thước byte được tuần tự hoá của kết quả khi được trả về cho ứng dụng qua mạng. Trong trường hợp tất cả các trường được tham chiếu trong truy vấn đều được chỉ mục thông thường bao phủ, điều này cũng cho phép truy vấn được quét chỉ mục đầy đủ, tránh việc phải tìm nạp tài liệu từ bộ nhớ chính.
Sử dụng chỉ mục
Hãy làm theo hướng dẫn sau đây để thiết lập và tối ưu hoá chỉ mục.
Xác định xem truy vấn có đang sử dụng chỉ mục hay không
Bạn có thể xác định xem truy vấn có đang sử dụng chỉ mục hay không bằng cách kiểm tra các nút lá trong cây thực thi. Nếu nút lá của cây thực thi là một nút TableScan, thì điều đó có nghĩa là truy vấn không sử dụng chỉ mục và đang quét tài liệu từ bộ nhớ chính. Nếu đang sử dụng chỉ mục, nút lá của cây thực thi sẽ hiển thị mã nhận dạng chỉ mục và các trường chỉ mục của chỉ mục.
Xác định chỉ mục tốt hơn
Chỉ mục hữu ích cho truy vấn nếu có thể giảm số lượng tài liệu mà công cụ truy vấn cần tìm nạp từ bộ nhớ chính hoặc nếu thứ tự trường của chỉ mục có thể đáp ứng yêu cầu Sắp xếp của truy vấn.
Nếu một chỉ mục được sử dụng cho truy vấn, nhưng công cụ truy vấn vẫn đang tìm nạp và loại bỏ nhiều tài liệu (như được xác định bởi nút Quét trả về nhiều bản ghi, sau đó là nút Lọc trả về ít bản ghi), thì đây là dấu hiệu cho thấy vị từ truy vấn được đáp ứng bằng chỉ mục không có tính chọn lọc. Để tạo chỉ mục phù hợp hơn, hãy xem phần Tạo chỉ mục.
Nếu một chỉ mục được sử dụng cho truy vấn, nhưng công cụ truy vấn vẫn đang sắp xếp lại tập kết quả trong bộ nhớ (như được xác định bởi nút MajorSort trong cây thực thi truy vấn), thì đây là dấu hiệu cho thấy chỉ mục được sử dụng không thể dùng để đáp ứng yêu cầu Sắp xếp của truy vấn. Để tạo chỉ mục phù hợp hơn, hãy xem phần tiếp theo.
Tạo chỉ mục
Hãy làm theo tài liệu quản lý chỉ mục để tạo chỉ mục. Để đảm bảo truy vấn của bạn có thể sử dụng chỉ mục, hãy tạo chỉ mục thông thường (không phải chỉ mục Multikey) có các trường theo thứ tự sau:
- Tất cả các trường sẽ được sử dụng trong toán tử bằng nhau. Để tối đa hoá cơ hội sử dụng lại trên các truy vấn, hãy sắp xếp các trường theo thứ tự giảm dần của số lần xuất hiện các trường trong toán tử bằng nhau giữa các truy vấn.
- Tất cả các trường sẽ được sắp xếp (theo cùng một thứ tự).
- Các trường sẽ được sử dụng trong toán tử phạm vi hoặc toán tử không bằng nhau theo thứ tự giảm dần của tính chọn lọc ràng buộc truy vấn.
- Các trường sẽ được trả về trong truy vấn trong chỉ mục: việc đưa các trường như vậy vào chỉ mục cho phép chỉ mục bao phủ truy vấn và tránh phải tìm nạp tài liệu từ bộ nhớ chính.
Buộc quét chỉ mục hoặc bảng
Khi bạn truy vấn Cloud Firestore, hệ thống sẽ tự động sử dụng mọi chỉ mục có
khả năng giúp truy vấn hiệu quả hơn. Do đó, bạn không cần chỉ định chỉ mục cho truy vấn. Tuy nhiên, đối với các truy vấn quan trọng đối với khối lượng công việc của bạn, bạn nên sử dụng tuỳ chọn forceIndex để có hiệu suất ổn định hơn.
Trong một số trường hợp, Cloud Firestore có thể chọn một chỉ mục khiến độ trễ truy vấn
tăng lên. Nếu bạn đã làm theo các bước khắc phục sự cố đối với tình trạng giảm hiệu suất và xác nhận rằng bạn nên thử một chỉ mục khác cho truy vấn, thì bạn có thể chỉ định chỉ mục bằng cách sử dụng tuỳ chọn forceIndex.
Bạn có thể sử dụng tuỳ chọn forceIndex trên mọi giai đoạn đầu vào trong
các thao tác của Quy trình để ghi đè kế hoạch truy vấn mặc định của Cloud Firestore's và chỉ định chỉ mục cần sử dụng hoặc buộc quét bảng.
Buộc một chỉ mục cụ thể
Để buộc truy vấn sử dụng một chỉ mục cụ thể, hãy cung cấp mã nhận dạng chỉ mục dưới dạng chuỗi cho tuỳ chọn forceIndex. Bạn có thể tìm thấy mã nhận dạng chỉ mục trong bảng điều khiển hoặc trong thông báo lỗi.
Ví dụ sau đây buộc trình lập kế hoạch sử dụng chỉ mục có mã nhận dạng CICAgOi36pgK:
Node.js
// Force Planner to use Index ID CICAgOi36pgK await db.pipeline() .collectionGroup({ collectionId: "customers", forceIndex: "CICAgOi36pgK" }) .limit(100) .execute();
Java
// Force Planner to use Index ID CICAgOi36pgK Pipeline.Snapshot results1 = firestore.pipeline() .collectionGroup("customers", new CollectionGroupOptions() .withHints(new CollectionHints().withForceIndex("CICAgOi36pgK"))) .limit(100) .execute().get();
Bắt đầu
// Force Planner to use Index ID CICAgOi36pgK snapshot1 := client.Pipeline(). CollectionGroup("customers", firestore.WithForceIndex("CICAgOi36pgK")). Limit(100). Execute(ctx)
Sau đây là một số trường hợp sử dụng để buộc một chỉ mục cụ thể:
- Kiểm thử hiệu suất của các chỉ mục khác nhau.
- Đảm bảo một chỉ mục cụ thể, đã biết là tối ưu được sử dụng cho truy vấn.
- Ghi đè trình tối ưu hoá khi lựa chọn mặc định của trình tối ưu hoá không tối ưu cho một truy vấn cụ thể.
Nếu không tìm thấy chỉ mục được chỉ định, truy vấn sẽ không thành công.
Buộc quét bảng
Quá trình quét bảng sẽ đọc các tài liệu trong bộ sưu tập hoặc nhóm bộ sưu tập mà không sử dụng bất kỳ chỉ mục thứ cấp nào. Để buộc quét bảng, hãy đặt forceIndex thành primary.
Ví dụ sau đây buộc quét bảng:
// Force Planner to only do a Full-Table Scan
db.pipeline()
.collectionGroup({ collectionId: "customers", forceIndex: "primary" })
.limit(100)
Bạn có thể sử dụng quá trình quét bảng trong các trường hợp sau:
- Đối với các bộ sưu tập rất nhỏ mà chi phí chung của chỉ mục không được đảm bảo.
- Đối với các truy vấn truy cập vào hầu hết các tài liệu trong một bộ sưu tập.
- Để gỡ lỗi và so sánh hiệu suất.
Sử dụng forceIndex với công cụ Giải thích truy vấn
Bạn có thể sử dụng Giải thích truy vấn ở chế độ
explain hoặc analyze để quan sát các hiệu ứng của forceIndex:
- Xác minh rằng Cloud Firestore đã sử dụng chỉ mục được chỉ định trong
forceIndexbằng cách kiểm tra các nút lá của cây thực thi để tìm mã nhận dạng chỉ mục. - Xác nhận rằng nút
TableScanxuất hiện trong kế hoạch khi sử dụngforceIndex: "primary". - Ở chế độ
analyze, hãy so sánh các chỉ số hiệu suất (chẳng hạn như độ trễ, số tài liệu được quét và số mục nhập chỉ mục được quét) có và không cóforceIndexđể tinh chỉnh hiệu suất truy vấn.
Các phương pháp hay nhất cho forceIndex
Mặc dù forceIndex giúp bạn kiểm soát quá trình thực thi truy vấn nhiều hơn,
Cloud Firestore thường hiệu quả đối với hầu hết các trường hợp sử dụng.
Hãy cân nhắc các phương pháp hay nhất sau đây khi sử dụng forceIndex:
- Sử dụng
forceIndexmột cách thận trọng. Nếu bạn nhận thấy hiệu suất không tối ưu với kế hoạch truy vấn mặc định, hãy sử dụng công cụ Giải thích truy vấn để chẩn đoán vấn đề trước khi buộc một chỉ mục. - Khi sử dụng
forceIndex, hãy nhớ kiểm thử các truy vấn của bạn với khối lượng dữ liệu thực tế để hiểu hiệu suất và đặc điểm chi phí của chúng. - Tránh sử dụng
forceIndex: "primary"trên các bộ sưu tập lớn trong môi trường sản xuất.
Để biết thêm thông tin về kết quả của truy vấn được thực thi bằng công cụ Giải thích truy vấn, hãy xem phần Tài liệu tham khảo về thực thi truy vấn.