前言
explian/desc可以幫助我們分析sql語(yǔ)句,寫(xiě)出高效sql語(yǔ)句,讓mysql查詢優(yōu)化器可以更好的工作。
mysql查詢優(yōu)化器會(huì)盡可能的使用索引,優(yōu)化器排除的數(shù)據(jù)行越多,mysql找到匹配數(shù)據(jù)行就越快。
用法
explain/desc + sql
explain select * from tbl_chain_bill where billid = 6

explain.png
| key | value | means |
|---|---|---|
| id | 1 | 查詢序列號(hào) |
| select_type | SIMPLE | 查詢類型 |
| table | tbl_chain_bill | 表或派生表名 |
| type | const | 掃描類型 |
| possible_keys | PRIMARY | 可能用的索引,有多個(gè) |
| key | PRIMARY | 實(shí)際使用索引 |
| key_len | 8 | 使用的索引長(zhǎng)度,在不損失精度下,長(zhǎng)度越短越好 |
| ref | const | 顯示索引的哪一列被使用了 |
| rows | 1 | 該語(yǔ)句掃描了多少行記錄 |
| Extra | (Null) | sql語(yǔ)句額外信息,如排序分組等 |
分析
id
表示執(zhí)行select子句順序的標(biāo)識(shí)。id相同,順序由上至下;id越大,越先執(zhí)行。
select_type
- SIMPLE:簡(jiǎn)單SELECT,不使用UNION或子查詢等;
- PRIMARY:查詢中若包含任何復(fù)雜的子部分,最外層的select被標(biāo)記為PRIMARY;
- UNION:UNION中的第二個(gè)或后面的SELECT語(yǔ)句;
- UNION RESULT:UNION的結(jié)果;
- SUBQUERY:子查詢中的第一個(gè)SELECT;
- DERIVED:派生表的SELECT,F(xiàn)ROM子句的子查詢;
- UNCACHEABLE SUBQUERY:結(jié)果集不能緩存的子查詢。
table
表示數(shù)據(jù)來(lái)源于哪張表或派生表。

image.png
type
從上到下,性能由差到好
- ALL:從頭到尾全表掃描;
- Index:全索引樹(shù)掃描,只遍歷索引樹(shù);
- Range:只檢索給定的范圍,需要使用一個(gè)索引來(lái)選擇行,key代表使用的索引;
- Ref:用于連接匹配的索引列不唯一時(shí),如where bill.billNo = billDetail.billNo;
- Eq ref:用于連接匹配的索引列是unique或者primary key時(shí),如where bill.id = billDetail.billID;
- const:用常數(shù)來(lái)比較primary key時(shí)嗎,比如where primary key = 123;
- system:被查詢表只有一行記錄,用常數(shù)來(lái)比較primary key時(shí)。
extra
extra 中出現(xiàn)以下 2 項(xiàng)意味著 MYSQL 根本不能使用索引,效率會(huì)受到重大影響,應(yīng)盡可能對(duì)此進(jìn)行優(yōu)化。
Using filesort 表示 MySQL會(huì)對(duì)結(jié)果使用一個(gè)外部索引排序,而不是從表里按索引次序讀到相關(guān)內(nèi)容。可能在內(nèi)存或者磁盤(pán)上進(jìn)行排序。
Using temporary 表示 MySQL 在對(duì)查詢結(jié)果排序時(shí)使用臨時(shí)表。常見(jiàn)于排序 order by 和分組查詢 group by。
測(cè)試說(shuō)明

測(cè)試說(shuō)明.png
需要指出的是,上面例子關(guān)于type=ref或者eq_ref是因?yàn)槲ㄒ凰饕拇嬖?,如果連接條件沒(méi)有唯一性約束,那么還是記錄少的放在連接查詢的左邊。