參考官方文檔:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
explain關鍵字可以分析你的查詢語句的結構和性能。
explain + select查詢, 執行會返回執行計劃的信息。 注意:如果from中有子查詢,仍然會執行該子查詢,將結果放入臨時表中。
1、mysql> explain extended select * from film where id = 1;
相比 explain 多了個 partitions 字段,如果查詢是基于分區表的話,會顯示查詢將訪問的分區。
2、mysql> show warnings;
得到優化后的查詢語句,從而看出優化器優化了什么。
explain中的列:
解釋 | |
id | 序號越大,優先級越高 |
select_type | simple:簡單插敘,不包含子查詢和join primary: 復雜查詢中的最外層select subquery: 包含在select中的查詢 derived: 包含在from子句中的查詢 union : union語句中的第二個隨后的select |
table | 1.訪問的表 2.from中有子查詢,table是<derivedN>格式,表示當前查詢的id=N的查詢 3. union時,<union 1,2> ,1和2參與union的select的id |
partitions | 查詢是基于分區表的話,會顯示查詢將訪問的分區 |
type | 表示關聯類型或訪問類型,即Mysql決定如何查找表中的行。 依次從最優到最差分別為:system > const > eq_ref > ref > range > index > ALL。 NULL表示在優化階段已經確定記錄,執行階段無需再訪問表或索引。 index:掃描全索引拿到結果,不是從索引根節點開始快速查找,這種查詢一般使用覆蓋索引。會比ALL快一點(索引的數據量少) ALL : 全表掃描,掃描聚集索引中的所有葉子節點。 |
possible_keys | 查詢可能使用哪些索引來查找。 |
key | 實際采用哪個索引來優化對該表的訪問, NULL表示沒有使用索引 |
key_len | mysql在索引里使用的字節數, 索引的最大長度是768字節,當字符串過長時,mysql會做一個類似左前綴索引的處理,將前半部分的字符提取出來做索引。 |
ref | 在key列記錄的索引中,表查找值所用到的列或常量, 常見的有:const(常量),字段名(例:film.id) |
rows | 估計要讀取并檢測的行數, 不一定代表實際值,值大也不一定比值小耗時更多 |
filterd | |
Extra | 重要值: Using index:使用覆蓋索引 Using where:使用 where 語句來處理結果,并且查詢的列未被索引覆蓋 Using index condition:查詢的列不完全被索引覆蓋,where條件中是一個前導列的范圍; Using temporary:mysql需要創建一張臨時表來處理查詢。出現這種情況一般是要進行優化的,首先是想到用索引來優化。 Using filesort:將用外部排序而不是索引排序,數據較小時從內存排序,否則需要在磁盤完成排序。這種情況下一般也是要考慮使用索引來優化的。(需要優化) Select tables optimized away:使用某些聚合函數(比如 max、min)來訪問存在索引的某個字段 |
幾個問題:
1. 主鍵索引和二級索引的選擇
????????要查的結果集(結果集的字段) 在主鍵索引和二級索引中都有, 優先選擇小的索引(二級索引);如果表新增一個字段,那么二級索引就不包含全部的字段, 就不一定走二級索引了。
2. 覆蓋索引
????????如果查的結果在索引數中都能找到, 叫覆蓋索引, 即不需要回表的查詢。