explain 詳解:
做用:主要用來調取語句的執行計劃,主要是判斷語句是否走索引。
explain select stu_name,gender,age from stu where gender='F' and age <20;
mysql> explain select name,gender,age from test where gender='F' and age <20;
+----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-----------------------+
| 1 | SIMPLE | test | range | inx_test | inx_test | 7 | NULL | 1 | Using index condition |
explain查詢結果中咱們須要重點關注兩個字段:type 和 extra
type
須要關注的第一個字段也是最重要的字段.
type : 表示MySQL在表中找到所需行的方式,又稱「訪問類型」,
常見類型以下:
ALL, index, range, ref, eq_ref, const, system, NULL
從左到右,性能從最差到最好。range是咱們所能接受的最低的範圍,最不但願看到(ALL, index)。這是有問題的,須要優化。
1. ALL
Full Table Scan, MySQL將遍歷全表以找到匹配的行
若是顯示ALL,說明:查詢沒有走索引。緣由以下:
一、語句自己的問題
二、索引的問題,沒創建索引
2. index
index:Full Index Scan,index與ALL區別爲index類型只遍歷索引樹
例子:
explain select count(*) from stu ;
3. range
range:索引範圍掃描,對索引的掃描開始於某一點,返回匹配值域的行。
顯而易見的索引範圍掃描是帶有between或者where子句裏帶有<,>查詢。
where 條件中有範圍查詢或模糊查詢時
> < >= <= between and in () or
like 'xx%'
當mysql使用索引去查找一系列值時,例如IN()和OR列表,也會顯示range(範圍掃描),固然性能上面是有差別的。
4. ref
ref:使用非惟一索引掃描或者惟一索引的前綴掃描,返回匹配某個單獨值的記錄行
where stu_name='xiaoming'
explain select * from stu where stu_name='aa';
這是咱們添加完普通索引最但願看到的類型
5. eq_ref
eq_ref:相似ref,區別就在使用的索引是惟一索引,對於每一個索引鍵值,表中只有一條記錄匹配,簡單來講,
就是多表鏈接中使用primary key或者 unique key做爲關聯條件
join條件使用的是primary key或者 unique key
6. const、system
const、system:當MySQL對查詢某部分進行優化,並轉換爲一個常量時,使用這些類型訪問。
如將主鍵置於where列表中,MySQL就能將該查詢轉換爲一個常量
explain select * from city where id=1;
7. NULL
NULL:MySQL在優化過程當中分解語句,執行時甚至不用訪問表或索引,
例如從一個索引列裏選取最小值能夠經過單獨索引查找完成。
Extra
若是extra中出現如下幾個字段頗有多是由於沒有走 索引的排序。多是因爲一部分字段沒有走索引。
Using temporary
Using filesort
Using join buffer
排序 order by ,group by ,distinct,排序條件上沒有索引
explain select * from city where countrycode='CHN' order by population;
# 若是population沒有創建索引就會出現上述狀況
在join 的條件列上沒有創建索引
其餘須要關注的字段
key_len: 越短越好,若是太長的話,建議替換爲前綴索引。
rows(取到的結果所須要掃描的行數):越短越好,若是太長建議要對語句進行優化。