Phân tích quá trình thực thi truy vấn bằng Query Explain

Chỉ áp dụng cho phiên bản Cloud Firestore Enterprise.

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 Query Explain để hiểu cách truy vấn của bạn đang được thực thi. Thông tin này cung cấp những chi tiết mà bạn có thể dùng để tối ưu hoá truy vấn.

Bạn có thể sử dụng Query Explain thông qua Google Cloud Console 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 và mở thẻ Giải thích:

  1. Trong bảng điều khiển Google Cloud, hãy chuyển đến trang Cơ sở dữ liệu.

    Chuyển đến phần Cơ sở dữ liệu

  2. Trong danh sách cơ sở dữ liệu, hãy chọn một cơ sở dữ liệu Cloud Firestore có khả năng tương thích với MongoDB. Google Cloud Console sẽ mở Firestore Explorer cho cơ sở dữ liệu đó.
  3. Nhập một truy vấn trong trình chỉnh sửa truy vấn rồi nhấp vào Chạy.
  4. Nhấp vào thẻ Giải thích để xem kết quả phân tích truy vấn.

    Thẻ Giải thích truy vấn trong bảng điều khiển
MongoDB API

Truy vấn Explain trong MongoDB API được hỗ trợ thông qua lệnh explain. Bạn có thể dùng lệnh này trong các công cụ như Mongo Shell và Compass.

Lệnh explain được hỗ trợ cùng với các lệnh aggregate, find, distinctcount, ví dụ:

db.collection.explain.find(...)

Bạn cũng có thể sử dụng phương thức explain(), ví dụ:

db.collection.find({QUERY}).explain()
Các điểm hạn chế
Xin lưu ý những điểm khác biệt và hạn chế 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 explain bằng cách gọi trực tiếp lệnh sau:

    db.collection.aggregate(..., explain: true)
  • Query Explain chỉ được hỗ trợ trên các lệnh find, aggregate, countdistinct.

  • Các lựa chọn VerbosityComment của Query Explain không được hỗ trợ thông qua API MongoDB. Hành vi này khớp với lựa chọn executionStats. Các tuỳ chọn allPlansExecutionqueryPlanner sẽ bị bỏ qua nếu được cung cấp.

Phân tích

Đầu ra của Query Explain chứa hai thành phần chính: 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

Đầu ra được giải thích ở trên cùng chứa thông tin tóm tắt về số liệu thống kê thực thi. Hãy sử dụng những số liệu thống kê này để xác định xem một truy vấn có độ trễ hoặc chi phí cao hay không. Công cụ 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 bạn 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ẽ duyệt qua 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ề việc 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 phần Tối ưu hoá quá trình thực thi truy vấn.

Sau đây là ví dụ về một 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