MySQL 優化 —— Explain 執行計劃的理解
引言
本部落格總結自MySQL 官網 Understanding the Query Execution Plan 專題。
根據我們的表、欄位、索引、以及 where 子句中的條件等資訊,MySQL 優化器會考慮各種技術來更高效地執行查詢。一個大表中的查詢不一定要讀取所有記錄;多表連線也不一定需要比較每條聯合記錄。優化器選擇的執行最優查詢的操作集,稱為“查詢執行計劃”,也可以說是 EXPLAIN 計劃。我們的目標就是找到那些可以將查詢優化地更好的點,然後通過學習 SQL 語法和索引等技術,來改善執行計劃。
一、什麼是 EXPLAIN ?
EXPLAIN 語句提供了 MySQL 如何執行語句的資訊:
1、EXPLAIN 可以和 SELECT DELETE INSERT REPLACE UPDATE 語句等一起工作;
2、當 EXPLAIN 和一個可被解釋的語句一起使用時,MySQL 就會展示來自優化器的關於語句執行計劃的資訊。即,MySQL 會解釋它將會怎樣執行語句,包括表是如何連線、以什麼方式排序等資訊。
3、When EXPLAIN is used with FOR CONNECTION
rather than an explainable statement,it displays the execution plan for the statement executing in the named connection.connection_id
4、對於 SELECT 語句, EXPLAIN 提供了額外的執行計劃資訊,可以用 SHOW WARNINGS 來檢視。
5、EXPLAIN對於檢查涉及分割槽表的查詢非常有用。
6、FORMAT 選項可以用於選擇輸出格式。TRADITIONAL 以表格的形式展示。如果沒有指定 FORMAT 選項,那麼TRADITIONAL 是預設的。JSON 格式會以 json 格式展示。
在 EXPLAIN 的幫助下,你可以清楚的知道為了讓查詢變得更快,該在哪裡給表新增索引。你也可以知道優化器是否以最佳的順序連線各個表。為了提示優化器使用與SELECT語句中表的命名順序相對應的連線順序,請以SELECT STRAIGHT_JOIN(而不是SELECT)開始該語句。However,STRAIGHT_JOIN
優化器跟蹤有時可能提供與EXPLAIN互補的資訊。但是,優化器跟蹤格式和內容可能在版本之間發生變化。
如果你對本應該使用索引而沒有用到索引的情況感到疑惑,執行一下 ANALYZE TABLE 來更新表統計資訊。例如鍵的基數,這會影響優化器所做的選擇。
注意:
EXPLAIN 還可以用來獲取表中列的資訊。 EXPLAIN 表名 與 DESCRIBE 表名 和 SHOW CLOUMS FROM 表名 是等價的。
(未完待續。。。。)