通過 EXPLAIN 分析低效 SQL的執行計劃:
通過以上步驟查詢到效率低的SQL後,我們可以通過explain或者desc 獲取MySQL如何執行SELECT語句的信息,包括select語句執行過程表如何連接和連接的次序。
explain可以知道什麼時候必須為表加入索引以得到一個使用索引來尋找記錄的更快的SELECT。
MySQL> explain select sum(moneys) from sales a,companys b where a.company_id =
b.id and a.year = 2006;
+----------------+----------+-----------+----------------+----------------+---------
-+-----------+----------------+
| select_type| table | type | possible_keys| key| key_len|rows
| Extra|
+----------------+----------+-----------+----------------+----------------+---------
-+-----------+----------------+
| SIMPLE| b| index | PRIMARY| PRIMARY| 4|1 | Using index
|
| SIMPLE| a| ALL| NULL| NULL| NULL |12 | Using where
|
+----------------+----------+-----------+----------------+----------------+---------
-+-----------+----------------+
2 rows in set (0.02 sec)
select_type:select 類型
table:輸出結果集的表
type:表示表的連接類型
當表中僅有一行是type的值為system是最佳的連接類型;
當select操作中使用索引進行表連接時type的值為ref;
當select的表連接沒有使用索引時,經常會看到type的值為ALL,表示對該表進行了全表掃描,這時需要考慮通過創建索引來提高表連接的效率。
possible_keys: 表示查詢時,可以使用的索引列.
key:表示使用的索引
key_len:索引長度
rows:掃描范圍
Extra:執行情況的說明和描述
確定問題,並采取相應的優化措施:
經過以上步驟,基本可以確認問題出現的原因,可以根據情況采取相應的措施,進行優化提高執行的效率。
例如上面的例子,我們確認是對a表的全表掃描導致效率的不理想,我們對a表的year字段創建了索引,查詢需要掃描的行數明顯較少。
MySQL> explain select sum(moneys) from sales a,companys b where a.company_id =
b.id and a.year = 2006;
+----------------+----------+-----------+----------------+----------------+---------
-+-----------+----------------+
| select_type| table | type | possible_keys| key| key_len|rows
| Extra|
+----------------+----------+-----------+----------------+----------------+---------
-+-----------+----------------+
| SIMPLE| b| index | PRIMARY| PRIMARY| 4|1 | Using index
|
| SIMPLE| a| ref| year| year| 4|3 |Using
where|
+----------------+----------+-----------+----------------+----------------+---------
-+-----------+----------------+
2 rows in set (0.02 sec)