在使用數據庫時,可能會出現表對應字段已經創建了索引,但是SQL語句執行慢的情況。您可以使用EXPLAIN命令查看下對應的查詢計劃,從而可以快速定位慢SQL。

下圖為您展示優化器從開始解析到最終執行的過程。

優化器介紹

語法

EXPLAIN 命令可以輸出SQL 語句的查詢計劃,具體語法如下:

EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement

where option can be one of:
    ANALYZE [ boolean ]
    VERBOSE [ boolean ]
    COSTS [ boolean ]
    BUFFERS [ boolean ]
    TIMING [ boolean ]
    SUMMARY [ boolean ]
    FORMAT { TEXT | XML | JSON | YAML }
  • BUFFERS選項為TRUE會顯示關于緩存的使用信息,默認為FALSE。該參數只能與ANALYZE 參數一起使用。緩沖區信息包括共享塊(常規表或者索引塊)、本地塊(臨時表或者索引塊)和臨時塊(排序或者哈希等涉及到的短期存在的數據塊)的命中塊數,更新塊數,擠出塊數。
  • COSTS選項為TRUE會顯示每個計劃節點的預估啟動代價(找到第一個符合條件的結果的代價)和總代價,以及預估行數和每行寬度,默認為TRUE。
  • VERBOSE選項為TRUE會顯示查詢計劃的附加信息,默認為FALSE。附加信息包括查詢計劃中每個節點輸出的列(Output),表的SCHEMA信息,函數的SCHEMA 信息,表達式中列所屬表的別名,被觸發的觸發器名稱等。
  • ANALYZE選項為TRUE會實際執行SQL,并獲得相應的查詢計劃,默認為FALSE。如果優化一些修改數據的SQL 需要真實的執行但是不能影響現有的數據,可以放在一個事務中,分析完成后可以直接回滾。
  • FORMAT指定輸出格式,默認為TEXT。各個格式輸出的內容都是相同的,其中XML | JSON | YAML更有利于您通過程序解析SQL語句的查詢計劃。
  • SUMMARY選項為TRUE會在查詢計劃后面輸出總結信息,例如查詢計劃生成的時間和查詢計劃執行的時間。當ANALYZE 選項打開時,它默認為TRUE。
  • TIMING選項為TRUE會顯示每個計劃節點的實際啟動時間和總的執行時間,默認為TRUE。該參數只能與ANALYZE 參數一起使用。因為對于一些系統來說,獲取系統時間需要比較大的代價,如果只需要準確的返回行數,而不需要準確的時間,可以把該參數關閉。