當sql運行比較耗時的時候,能夠進行sql優化,好比加索引,調整sql的結構等等。咱們看sql運行的狀態等信息時,能夠經過執行計劃來參考。mysql
explain + sql 語句
查看 執行計劃。算法
例如:EXPLAIN SELECT * FROM `g_play_log` WHERE `user_id` = '6178962'sql
上圖爲sql的執行計劃查詢結果,經過結果能夠看到走的是全表查詢(type=ALL),須要涉及到的數據行數643420,這樣查詢的效率不高,能夠對錶作一個簡單的優化以後,再看看執行劃。由於經過where條件,條件爲user_id,能夠對user_id建一個索引,建好索引後,再看執行計劃的結果以下。app
經過兩次的結果對比能夠看到,加上索引以後,查詢會走索引(type=ref,key=user_id_index),須要涉及到的數據行數61,這樣查詢的效率會大大的提升。性能
select_type:優化
SIMPLE(簡單查詢),
PRIMARY(最外層查詢),
SUBQUERY(映射爲子查詢),
DERIVED(子查詢),
UNION(聯合),
UNION RESULT(使用聯合的結果)spa
table : 正在訪問的表名code
type:blog
ALL(全數據表掃描),
index(全索引表掃描),
RANGE(對索引列進行範圍查找),
INDEX_MERGE(合併索引,使用多個單列索引搜索),
REF(根據索引查找一個或多個值),
EQ_REF(搜索時使用primary key 或 unique類型),
CONST(常量,表最多有一個匹配行,由於僅有一行,在這行的列值可被優化器剩餘部分認爲是常數,const表很快,由於它們只讀取一次),
SYSTEM(系統,表僅有一行(=系統表)。這是const聯接類型的一個特例)排序
說明:性能:all
< index
< range
< index_merge
< ref_or_null
< ref
< eq_ref
< system/const(
性能在 range 之下基本均可以進行調優)
possible_keys:可能使用的索引
key:真實使用的索引
key_len:MySQL中使用索引字節長度
rows:mysql 預估爲了找到所需的行而要讀取的行數
extra:
Using index
(此值表示mysql將使用覆蓋索引,以免訪問表),
Using where
(mysql 將在存儲引擎檢索行後再進行過濾,許多where條件裏涉及索引中的列,當它讀取索引時,就能被存儲引擎檢驗,所以不是全部帶where子句的查詢都會顯示「Using where」。有時「Using where」的出現就是一個暗示:查詢可受益於不一樣的索引),
Using temporary
(mysql 對查詢結果排序時會使用臨時表),
Using filesort
(mysql會對結果使用一個外部索引排序,而不是按索引次序從表裏讀取行。mysql有兩種文件排序算法,這兩種排序方式均可以在內存或者磁盤上完成,explain不會告訴你mysql將使用哪種文件排序,也不會告訴你排序會在內存裏仍是磁盤上完成),
Range checked for each record(index map: N)
(沒有好用的索引,新的索引將在聯接的每一行上從新估算,N是顯示在possible_keys列中索引的位圖,而且是冗餘的)
1.使用 like 語句時,%在右邊纔會使用索引。
2.or 條件中有未創建索引的列索引失效。
3.條件的類型不一致索引失效。
4.使用!=時部分狀況索引失效。(若是是主鍵,則會走索引)
5.使用>時部分狀況索引失效。(若是是主鍵或索引是整數類型,則會走索引)
6.order by部分狀況索引失效。(若是 order by 的列是主鍵或索引是整數類型,則會走索引)
7.組合索引(遵循最左前綴)