文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

10.8.3 擴展的 EXPLAIN 輸出格式

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

SHOW WARNINGS 輸出中的 Message 值會顯示最佳化工具如何限定 SELECT 陳述式中的資料表和欄位名稱、在套用重寫和最佳化規則之後,SELECT 看起來的樣子,以及可能有關最佳化程序的其他注意事項。

只有在 SELECT 陳述式之後,才產生可以使用 SHOW WARNINGS 陳述式顯示的擴展資訊。對於其他可解釋的陳述式(DELETEINSERTREPLACEUPDATE),SHOW WARNINGS 會顯示空的結果。

以下是擴展 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)

    如果條件為真,則評估為 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 表格存取會顯示為使用 const 值的 ref 存取。