8.8.1 通過 EXPLAIN 來優化查詢
EXPLAIN 語句會提供 MySQL 如何執行查詢的信息:
-
EXPLAIN 可以對 SELECT,DELETE,INSERT,和 UPDATE 語句進行分析。
-
當對一個可分析的語句進行 EXPLAIN 操作時,MySQL 會顯示優化器的查詢執行計劃,也就是 MySQL 會分析出如何處理這條語句,包括不同表之間時如何聯合的。關於如何使用 EXPLAIN 來獲取查詢執行計劃信息可以查閱 8.2 EXPLAIN 輸出格式。
-
當 EXPLAIN 對
FOR CONNECTION connection_id
執行而不是對可分析語句執行的話,它會顯示當前命名連接正在執行語句的執行計劃,詳情可查閱 8.8.4 獲取命名連接的執行計劃信息。 -
對於 SELECT 語句來說,EXPLAIN 會產生額外的查詢執行計劃信息,可以通過 SHOW WARNINGS 語句來獲取這些額外信息。詳情可查閱 8.8.3 擴展 EXPLAIN 輸出格式。
-
EXPLAIN 對於考察分區數據表的查詢非常有用。詳情可查閱 23.3.5 Obtaining Information About Partitions
-
可以使用 FORMAT 選項來控制輸出格式。TRADITIONAL 是默認的輸出格式代表以表格的形式輸出,JSON 會以 JSON 的格式輸出數據。
通過 EXPLAIN ,可以知道在哪裏添加索引來加速查找行,從而加速語句的執行。也可以通過 EXPLAIN 語句來檢查優化器是否以最優的方式來聯合表。使用 SELECT STRAIGHT_JOIN 語句代替 SELECT 語句,來讓優化器按照指定的順序來聯合表,詳情可查閱 13.2.10, “SELECT Statement”。使用 STRAIGHT_JOIN 的時候會禁用半聯合轉換,從而不能有效的使用索引。詳情可查閱 [8.2.2.1 使用半聯合轉換優化 IN 和 EXIST 子查詢]。
優化器追蹤提供的信息有時可以和 EXPLAIN 互補。但是優化器追蹤的輸出格式會隨着版本的變化而變化。關於優化器追蹤的詳細信息可查閱 MySQL Internals: Tracing the Optimizer.。
有時候在你明確已經使用了索引的時候,但執行計劃中沒有使用索引,你可以執行 ANALYZE TABLE 來更新表的統計信息(如鍵的基數等)從而改變優化器的選擇。詳細信息可查閱 13.7.3.1 ANALYZE TABLE Statement。
Note
EXPLAIN 也可以用於獲取表的列信息。EXPLAIN tbl_name
和DESCRIBE tbl_name
、SHOW COLUMNS FROM tbl_name
的功能是一樣的。詳細信息可查閱 13.8.1 DESCRIBE Statement 和 13.7.7.5 SHOW COLUMNS Statement。