前言
explian/desc可以幫助我們分析sql語句赢底,寫出高效sql語句粥脚,讓mysql查詢優(yōu)化器可以更好的工作慈鸠。
mysql查詢優(yōu)化器會盡可能的使用索引御雕,優(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 | 查詢序列號 |
select_type | SIMPLE | 查詢類型 |
table | tbl_chain_bill | 表或派生表名 |
type | const | 掃描類型 |
possible_keys | PRIMARY | 可能用的索引,有多個 |
key | PRIMARY | 實際使用索引 |
key_len | 8 | 使用的索引長度,在不損失精度下漫贞,長度越短越好 |
ref | const | 顯示索引的哪一列被使用了 |
rows | 1 | 該語句掃描了多少行記錄 |
Extra | (Null) | sql語句額外信息甸箱,如排序分組等 |
分析
id
表示執(zhí)行select子句順序的標識。id相同迅脐,順序由上至下芍殖;id越大,越先執(zhí)行谴蔑。
select_type
- SIMPLE:簡單SELECT豌骏,不使用UNION或子查詢等;
- PRIMARY:查詢中若包含任何復雜的子部分隐锭,最外層的select被標記為PRIMARY窃躲;
- UNION:UNION中的第二個或后面的SELECT語句;
- UNION RESULT:UNION的結(jié)果钦睡;
- SUBQUERY:子查詢中的第一個SELECT蒂窒;
- DERIVED:派生表的SELECT,F(xiàn)ROM子句的子查詢荞怒;
- UNCACHEABLE SUBQUERY:結(jié)果集不能緩存的子查詢洒琢。
table
表示數(shù)據(jù)來源于哪張表或派生表。
image.png
type
從上到下褐桌,性能由差到好
- ALL:從頭到尾全表掃描纬凤;
- Index:全索引樹掃描,只遍歷索引樹撩嚼;
- Range:只檢索給定的范圍,需要使用一個索引來選擇行挖帘,key代表使用的索引完丽;
- Ref:用于連接匹配的索引列不唯一時,如where bill.billNo = billDetail.billNo拇舀;
- Eq ref:用于連接匹配的索引列是unique或者primary key時逻族,如where bill.id = billDetail.billID;
- const:用常數(shù)來比較primary key時嗎骄崩,比如where primary key = 123聘鳞;
- system:被查詢表只有一行記錄,用常數(shù)來比較primary key時要拂。
extra
extra 中出現(xiàn)以下 2 項意味著 MYSQL 根本不能使用索引抠璃,效率會受到重大影響,應(yīng)盡可能對此進行優(yōu)化脱惰。
Using filesort 表示 MySQL會對結(jié)果使用一個外部索引排序搏嗡,而不是從表里按索引次序讀到相關(guān)內(nèi)容。可能在內(nèi)存或者磁盤上進行排序采盒。
Using temporary 表示 MySQL 在對查詢結(jié)果排序時使用臨時表旧乞。常見于排序 order by 和分組查詢 group by。
測試說明
測試說明.png
需要指出的是磅氨,上面例子關(guān)于type=ref或者eq_ref是因為唯一索引的存在尺栖,如果連接條件沒有唯一性約束,那么還是記錄少的放在連接查詢的左邊烦租。