Để khắc phục sự cố truy vấn chậm, hãy sử dụng Query Explain để 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ỳ thuộc vào hồ sơ thực thi:
Giới hạn số lượng kết quả
Sử dụng trường số 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. Hãy 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 chuyển đổi tuần tự của kết quả khi được trả về cho các ứng dụng qua mạng. Trong trường hợp nút Limit đứng trước nút MajorSort, công cụ truy vấn có thể kết hợp nút Limit và MajorSort, đồng thời thay thế quá trình hiện thực hoá và sắp xếp đầy đủ trong bộ nhớ bằng một thao tác 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ả
Hãy cân nhắc việc giới hạn kích thước của tài liệu do sử dụng 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ớ khi xử lý kết quả trung gian và kích thước byte được chuyển đổi tuần tự của kết quả khi được trả về cho các ứng dụng trên mạng. Trong trường hợp tất cả các trường được tham chiếu trong truy vấn đều nằm trong chỉ mục thông thường, điều này cũng cho phép truy vấn được chỉ mục quét hoàn toàn, tránh nhu cầu 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 để 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, điều đó có nghĩa là truy vấn không sử dụng chỉ mục và đang quét các tài liệu từ bộ nhớ chính. Nếu đang sử dụng một 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 một chỉ mục tốt hơn
Chỉ mục sẽ hữu ích cho một truy vấn nếu chỉ mục đó 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 dùng cho một 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ằng một nút Quét trả về nhiều bản ghi, sau đó là một 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 dùng cho một truy vấn, nhưng công cụ truy vấn vẫn đang thực hiện việc sắp xếp lại tập kết quả trong bộ nhớ (như được xác định bằng một 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 dùng không thể dùng để đáp ứng yêu cầu Sắp xếp của truy vấn. Để tạo một chỉ mục phù hợp hơn, hãy xem phần tiếp theo.
Tạo chỉ mục
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) với các trường theo thứ tự sau:
- Tất cả các trường sẽ được dùng trong toán tử so sánh bằng. Để 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 số lần xuất hiện của các trường trong toán tử so sánh bằng 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 dùng trong toán tử phạm vi hoặc toán tử bất đẳng thức theo thứ tự giảm dần của mức độ chọn lọc ràng buộc truy vấn.
- Các trường sẽ được trả về trong một 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 gồm 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, công cụ này 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 các truy vấn của mình. Tuy nhiên, đối với những 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 lựa 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 làm tăng độ trễ của truy vấn. Nếu đã làm theo các bước khắc phục sự cố về sự hồi quy 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 lựa chọn forceIndex.
Bạn có thể sử dụng lựa chọn forceIndex ở bất kỳ giai đoạn đầu vào nào trong các thao tác của Pipeline để ghi đè kế hoạch truy vấn mặc định của Cloud Firestore và chỉ định một chỉ mục để 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 một chuỗi cho lựa 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ể:
- Thử nghiệm hiệu suất của các chỉ mục khác nhau.
- Đảm bảo rằng một chỉ mục cụ thể, đã biết là tối ưu được dùng cho một 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 phù hợp với 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 phụ 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 tính năng quét bảng trong những trường hợp sau:
- Đối với những tập hợp rất nhỏ mà chi phí chỉ mục không được đảm bảo.
- Đối với những 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 tính năng Giải thích truy vấn
Bạn có thể sử dụng Query Explain, đặc biệt là với lựa chọn 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 cho mã nhận dạng chỉ mục. - Xác nhận rằng một nút
TableScanxuất hiện trong kế hoạch khi sử dụngforceIndex: "primary". - So sánh các chỉ số hiệu suất (chẳng hạn như độ trễ, số lượng tài liệu được quét và số lượng mục nhập chỉ mục được quét) khi 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 để đạt được forceIndex
Mặc dù forceIndex cung cấp nhiều quyền kiểm soát hơn đối với việc thực thi truy vấn, nhưng trình tối ưu hoá truy vấn của 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:
- Hãy 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 Query Explain để chẩn đoán vấn đề trước khi bắt 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ế để nắm được hiệu suất và đặc điểm chi phí của các truy vấn đó. - Tránh sử dụng
forceIndex: "primary"trên các tập hợp lớn trong môi trường sản xuất.