前言
本文旨在用最通俗的語言講述最枯燥的基本知識
這個話題比較有意思。昨天中午吃完飯間突然有個同事蹦出了一句:“like有索引嗎?”,我順口就說沒有,另一個同事反駁說有啊,還有些同事說看情況的有,這下有點懵逼了,都不知道那種說法是正確的,于是決定花了個半小時來研究驗證這個問題,終于得到答案。
怎么驗證的呢?
坊間有傳言:MySQL性能優化有個神器,叫做explain,它可以對select語句進行分析并且輸出詳細的select執行過程的詳細信息,讓開發者從這些信息中獲得優化的思路。
下面來講講這個MySQL提供的explain命令:
語法:explain SQL語句例如:
1explain select * from user where id=1 |
執行完畢之后,它的輸出有以下字段:
id
select_type
table
partitions
type
possible_keys
key
key_len
ref
rows
Extra
要想知道explain命名怎么使用,就必須把這些字段搞清楚
1. id
SELECT查詢的標識符, 每個SELECT語句都會自動分配一個唯一的標識符
2. select_type
每個select查詢字句的類型,具體類型以及對應作用如下表:
類型名 | 解釋 |
---|---|
SIMPLE | 簡單SELECT,不使用UNION或子查詢等 |
PRIMARY | 查詢中若包含任何復雜的子部分,最外層的select被標記為PRIMARY |
UNION | UNION中的第二個或后面的SELECT語句 |
DEPENDENT UNION | UNION中的第二個或后面的SELECT語句,取決于外面的查詢 |
UNION RESULT | UNION的結果 |
SUBQUERY | 子查詢中的第一個SELECT |
DEPENDENT SUBQUERY | 子查詢中的第一個SELECT,取決于外面的查詢 |
DERIVED | 派生表的SELECT, FROM子句的子查詢 |
UNCACHEABLE SUBQUERY | 一個子查詢的結果不能被緩存,必須重新評估外鏈接的第一行 |
3. table
顯示這一行的數據是查哪張表的,不過有時短路顯示的不是真實的表名。
4. partitions
匹配的分區(這個目前用處不大)
5. type
訪問類型,表示MySQL在表中找到所需行的方式,對應的值和解釋如下: