Trang này mô tả cách truy xuất thông tin thực thi truy vấn khi bạn thực thi một truy vấn.
Sử dụng tính năng Giải thích truy vấn
Bạn có thể sử dụng tính năng Giải thích truy vấn để hiểu cách thực thi truy vấn. Tính năng này cung cấp thông tin chi tiết mà bạn có thể dùng để tối ưu hoá truy vấn.
Bạn có thể sử dụng tính năng Giải thích truy vấn thông qua bảng điều khiển Cloud hoặc lệnh explain.
Bảng điều khiển
Thực thi một truy vấn trong Trình chỉnh sửa truy vấn rồi mở thẻ Explanation (Giải thích):
-
Trong bảng điều khiển Cloud, hãy chuyển đến trang Databases (Cơ sở dữ liệu).
- Trong danh sách cơ sở dữ liệu, hãy chọn một cơ sở dữ liệu Cloud Firestore. Bảng điều khiển Cloud của Google sẽ mở Firestore Explorer (Trình khám phá Firestore) cho cơ sở dữ liệu đó.
- Nhập một truy vấn vào trình chỉnh sửa truy vấn rồi nhấp vào Run (Chạy).
-
Nhấp vào thẻ Explanation (Giải thích) để xem kết quả phân tích truy vấn.
MongoDB API
Tính năng Giải thích truy vấn trong MongoDB API được hỗ trợ thông qua lệnh
explain
mà bạn có thể sử dụng trong các công cụ như Mongo Shell và Compass.
Lệnh explain được hỗ trợ bằng các lệnh aggregate, find, distinct và count, chẳng hạn:
db.collection.explain('executionStats').find(...)
Bạn cũng có thể sử dụng phương thức explain(), chẳng hạn:
db.collection.find({QUERY}).explain('executionStats')Hạn chế
Xin lưu ý những hạn chế và điểm khác biệt sau:-
Tính năng Giải thích truy vấn không hỗ trợ các lệnh trả về con trỏ. Ví dụ: bạn không thể gọi tính năng giải thích bằng cách gọi trực tiếp lệnh sau:
db.collection.aggregate(..., explain: true)
Tính năng Giải thích truy vấn chỉ được hỗ trợ trên các lệnh
find,aggregate,count, vàdistinct.-
Các tuỳ chọn
VerbosityvàCommentcủa tính năng Giải thích truy vấn không được hỗ trợ thông qua MongoDB API. Hành vi này khớp với tuỳ chọnexecutionStats. Các tuỳ chọnallPlansExecutionvàqueryPlannersẽ bị bỏ qua nếu được cung cấp.Nếu không có mức độ chi tiết nào được cung cấp, thì shell sẽ sử dụng mức độ chi tiết
queryPlannervà lọc ra số liệu thống kê về quá trình thực thi. Bạn phải sử dụng mức độ chi tiếtexecutionStatshoặcallPlansExecutionđể xem kết quả đầy đủ.
Phân tích
Kết quả của tính năng Giải thích truy vấn chứa 2 thành phần chính: Số liệu thống kê tóm tắt và Cây thực thi. Hãy xem xét truy vấn này làm ví dụ:
db.order.aggregate(
[
{ "$match": { "user_id": 1234 } },
{ "$sort": { "date_placed": 1 } }
]
)
Số liệu thống kê tóm tắt
Phần đầu của kết quả được giải thích chứa bản tóm tắt số liệu thống kê về quá trình thực thi. Hãy sử dụng các số liệu thống kê này để xác định xem một truy vấn có độ trễ cao hay chi phí cao hay không. Phần này cũng chứa số liệu thống kê về bộ nhớ để cho bạn biết truy vấn của mình gần với giới hạn bộ nhớ đến mức nào.
Billing Metrics:
read units: 1
Execution Metrics:
request peak memory usage: 4.00 KiB (4,096 B)
results returned: 1
Cây thực thi
Cây thực thi mô tả quá trình thực thi truy vấn dưới dạng một chuỗi các nút. Các nút dưới cùng (nút lá) truy xuất dữ liệu từ lớp lưu trữ, lớp này sẽ di chuyển lên cây để tạo phản hồi truy vấn.
Để biết thông tin chi tiết về từng nút thực thi, hãy tham khảo tài liệu tham khảo về Thực thi.
Để biết thông tin chi tiết về cách sử dụng thông tin này để tối ưu hoá truy vấn, hãy xem Tối ưu hoá quá trình thực thi truy vấn.
Sau đây là ví dụ về cây thực thi:
• Compute
| $out_1: map_set($record_1, "__id__", $__id___1, "__key__", $__key___1, "__row_id__", $__row_id___1, "__$0__", $__$0___2)
| is query result: true
|
| Execution:
| records returned: 1
|
└── • Compute
| $__$0___2: UNSET
|
| Execution:
| records returned: 1
|
└── • Compute
| $__key___1: UNSET
| $__row_id___1: UNSET
|
| Execution:
| records returned: 1
|
└── • Compute
| $__id___1: _id($record_1.__key__)
|
| Execution:
| records returned: 1
|
└── • MajorSort
| fields: [$v_5 ASC]
| output: [$record_1]
|
| Execution:
| records returned: 1
| peak memory usage: 4.00 KiB (4,096 B)
|
└── • Compute
| $v_5: array_get($v_4, 0L)
|
| Execution:
| records returned: 1
|
└── • Compute
| $v_4: sortPaths(array($record_1.date_placed), [date_placed ASC])
|
| Execution:
| records returned: 1
|
└── • Filter
| expression: $eq($user_id_1, 1,234)
|
| Execution:
| records returned: 1
|
└── • TableScan
source: **/my_collection
order: STABLE
properties: * - { __create_time__, __update_time__ }
output record: $record_1
output bindings: {$user_id_1=user_id}
variables: [$record_1, $user_id_1]
Execution:
records returned: 1
records scanned: 1
Bước tiếp theo
- Để tìm hiểu về các nút cây thực thi, hãy xem tài liệu tham khảo về Thực thi truy vấn.
- Để tìm hiểu cách tối ưu hoá truy vấn, hãy xem bài viết Tối ưu hoá quá trình thực thi truy vấn.