mysql的sql執行計劃
阿新 • • 發佈:2018-12-12
MySql提供EXPLAIN語法用來進行查詢分析,在SQL語句前加一個“EXPLAIN”,例:
EXPLAIN SELECT * FROM T_CLASS WHERE CLASS_NAME="網路工程"
執行結果: 執行結果解釋: select_type: 資料庫引擎將SQL拆分成若干部分的子查詢/子操作,每個查詢select子句中的查詢型別。 type:重要的項,顯示連線使用的型別,按最優到最差排序:
system | 表只有一行:system表。這是const連線型別的特殊情況。 |
---|---|
const | 表中的一個記錄的最大值能夠匹配這個查詢(索引可以是主鍵或惟一索引)。因為只有一行,這個值實際就是常數,因為MYSQL先讀這個值然後把它當做常數來對待。 |
eq_ref | 在連線中,MYSQL在查詢時,從前面的表中,對每一個記錄的聯合都從表中讀取一個記錄,它在查詢使用了索引為主鍵或惟一鍵的全部時使用。 |
range | 這個連線型別使用索引返回一個範圍中的行,比如使用>或<查詢東西時發生的情況。 |
index | 這個連線型別對前面的表中的每一個記錄聯合進行完全掃描(比ALL更好,因為索引一般小於表資料)。 |
ALL | 這個連線型別對於前面的每一個記錄聯合進行完全掃描,這一般比較糟糕,應該儘量避免。 |
possible_keys :顯示可能應用在這張表中的索引。如果為空,沒有可能的索引。可以為相關的域從WHERE語句中選擇一個合適的語句 key
Distinct | 一旦mysql找到了與行相聯合匹配的行,就不再搜尋了。 |
---|---|
Not exists | mysql優化了LEFT JOIN,一旦它找到了匹配LEFT JOIN標準的行,就不再搜尋了。 |
Range checked for each Record(index map:#) | 沒有找到理想的索引,這是使用索引的最慢的連線之一。 |
Using filesort | mysql需要進行額外的步驟來發現如何對返回的行排序,意味著 MYSQL 根本不能使用索引,效率會受到重大影響 |
Using index | 列資料是從僅僅使用了索引中的資訊而沒有讀取實際的行動的表返回的,這發生在對錶的全部的請求列都是同一個索引的部分的時候。 |
Using temporary | 這裡,mysql需要建立一個臨時表來儲存結果,這通常發生在對不同的列集進行ORDER BY上,而不是GROUP BY上。查詢需要優化 |
執行計劃不考慮可能設計的儲存過程、函式、觸發器帶來的額外效能小號,不分析insert語句,執行計劃不考慮Query Cache (快取機制)
使用Navicat檢視執行計劃 新建查詢——編寫好查詢語句——點選執行——點選解釋