文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
手冊頁 (TGZ) - 258.5Kb
手冊頁 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  擴展的 EXPLAIN 輸出格式

10.8.3 擴展的 EXPLAIN 輸出格式

EXPLAIN 語句會產生額外(擴展的)資訊,這些資訊不屬於 EXPLAIN 輸出的一部分,但可以透過在 EXPLAIN 後發出 SHOW WARNINGS 語句來檢視。擴展的資訊適用於 SELECTDELETEINSERTREPLACEUPDATE 語句。

SHOW WARNINGS 輸出中的 Message 值會顯示最佳化工具如何在 SELECT 語句中限定資料表和資料行名稱,套用重寫和最佳化規則後的 SELECT 看起來像什麼,以及可能關於最佳化程序的其他注意事項。

只有 SELECT 語句會產生可在 EXPLAIN 後使用 SHOW WARNINGS 語句顯示的擴展資訊。SHOW WARNINGS 會針對其他可解釋的語句(DELETEINSERTREPLACEUPDATE)顯示空的結果。

以下是擴展的 EXPLAIN 輸出範例

mysql> EXPLAIN
       SELECT t1.a, t1.a IN (SELECT t2.a FROM t2) FROM t1\G
*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: t1
         type: index
possible_keys: NULL
          key: PRIMARY
      key_len: 4
          ref: NULL
         rows: 4
     filtered: 100.00
        Extra: Using index
*************************** 2. row ***************************
           id: 2
  select_type: SUBQUERY
        table: t2
         type: index
possible_keys: a
          key: a
      key_len: 5
          ref: NULL
         rows: 3
     filtered: 100.00
        Extra: Using index
2 rows in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
  Level: Note
   Code: 1003
Message: /* select#1 */ select `test`.`t1`.`a` AS `a`,
         <in_optimizer>(`test`.`t1`.`a`,`test`.`t1`.`a` in
         ( <materialize> (/* select#2 */ select `test`.`t2`.`a`
         from `test`.`t2` where 1 having 1 ),
         <primary_index_lookup>(`test`.`t1`.`a` in
         <temporary table> on <auto_key>
         where ((`test`.`t1`.`a` = `materialized-subquery`.`a`))))) AS `t1.a
         IN (SELECT t2.a FROM t2)` from `test`.`t1`
1 row in set (0.00 sec)

由於 SHOW WARNINGS 顯示的語句可能包含特殊標記,以提供關於查詢重寫或最佳化工具動作的資訊,因此該語句不一定是有效的 SQL,並且不打算執行。輸出也可能包含 Message 值提供有關最佳化工具所執行動作的其他非 SQL 說明附註的列。

以下清單說明 SHOW WARNINGS 顯示的擴展輸出中可能出現的特殊標記

  • <auto_key>

    暫存資料表的自動產生索引鍵。

  • <cache>(expr)

    運算式(例如純量子查詢)會執行一次,且結果值會儲存在記憶體中以供稍後使用。對於由多個值組成的結果,可能會建立暫存資料表,並改為顯示 <temporary table>

  • <exists>(query fragment)

    子查詢述詞會轉換為 EXISTS 述詞,並轉換子查詢,以便與 EXISTS 述詞一起使用。

  • <in_optimizer>(query fragment)

    這是一個內部最佳化工具物件,沒有使用者意義。

  • <index_lookup>(query fragment)

    使用索引查詢處理查詢片段,以尋找符合條件的列。

  • <if>(condition, expr1, expr2)

    如果條件為 true,則評估為 expr1,否則評估為 expr2

  • <is_not_null_test>(expr)

    此測試用於驗證運算式是否不評估為 NULL

  • <materialize>(query fragment)

    使用子查詢實體化。

  • `materialized-subquery`.col_name

    參考一個內部暫存表格中名為 col_name 的欄位,此表格實體化以保存評估子查詢的結果。

  • <primary_index_lookup>(query fragment)

    使用主鍵查詢來處理查詢片段,以尋找符合條件的列。

  • <ref_null_helper>(expr)

    這是一個內部最佳化工具物件,沒有使用者意義。

  • /* select#N */ select_stmt

    SELECT 陳述式與非擴充的 EXPLAIN 輸出中 id 值為 N 的列相關聯。

  • outer_tables 半連接 (inner_tables)

    一個半連接運算。inner_tables 顯示未被提取出的表格。請參閱使用半連接轉換來最佳化 IN 和 EXISTS 子查詢述詞

  • <temporary table>

    這表示為了快取中間結果而建立的內部暫存表格。

當某些表格為 constsystem 類型時,涉及這些表格欄位的運算式會由最佳化工具提早評估,並且不屬於顯示的陳述式的一部分。但是,使用 FORMAT=JSON,某些 const 表格存取會顯示為使用常數值的 ref 存取。