MySQL基礎優化之explain使用

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(取到的結果所須要掃描的行數):越短越好,若是太長建議要對語句進行優化。
相關文章
相關標籤/搜索