mysql 多key索引_MYSQL的EXPLAIN到底多好用?
工欲善其事必先利其器!
作為一名程序員,免不了要和MYSQL打交道。而在這過程中,就不得不面對性能優(yōu)化這一大課題。
而在性能優(yōu)化中,EXPLAIN就是能夠幫助我們查看SQL執(zhí)行計劃是否優(yōu)化的一個工具。
今天,我們就基于一個案例來看看EXPLAIN的神奇作用。
一、具體案例
我們來執(zhí)行一條非常簡單的代碼:
expain select * from t1,t2,t3 where t1.id=t2.id and t2.id=t2.id;
執(zhí)行之后的結(jié)果如下:
發(fā)現(xiàn)出來了很多的字段,這么多字段其實也沒必要每個都重點關(guān)注,上面圖片用紅色框框標(biāo)出了5個字段,這些是需要重點關(guān)注的。下面具體來說說這5個字段的含義。
1.type
表示訪問表的方式,一共有6種。
從最好到最差的結(jié)果依次如下:
system > const > eq_ref > ref > range > index > ALL
注意:一個好的SQL語句至少要達到range級別!杜絕出現(xiàn)all級別。
system: 表示結(jié)果集僅有一行;
const: 表示通過主鍵或者唯一鍵查找數(shù)據(jù)時只匹配最多一行數(shù)據(jù);
eq_ref: 該類型多出現(xiàn)在多表join場景,通過主鍵或者唯一鍵訪問表;
對于前表b的每行記錄,都只能匹配到后表a的一行記錄并且查詢的比較操作通常是=,查詢效率較高。
ref: 此類型通常出現(xiàn)在sql使用非唯一或非主鍵索引, 或者是使用最左前綴規(guī)則索引的查詢;
range: 表示where條件使用索引范圍查詢,當(dāng) type 是 range 時,ref 字段為 NULL。
index: 表示全索引掃描, 掃描所有的索引記錄, 而不掃描數(shù)據(jù);
index 類型通常會出現(xiàn)在覆蓋索引中,所要查詢的數(shù)據(jù)直接在索引中就可以訪問, 而不用回表掃描數(shù)據(jù)。 此時Extra 字段 會顯示 Using index。還有一種是全表掃描時通過索引順序訪問數(shù)據(jù)。此時并不會在Extra提示 using index。
ALL: 表示執(zhí)行計劃選擇全表掃描,當(dāng)執(zhí)行計劃出現(xiàn)type 為all 時,我們盡量通過修改索引的方式讓查詢利用索引。
2.key
此字段是 MySQL 在當(dāng)前查詢時所使用到的索引。
如果沒有選擇索引,值是NULL。
可以采取強制索引方式。
3.key_len
key_len表示執(zhí)行計劃所選擇的索引長度有多少字節(jié),通常我們可借此判斷聯(lián)合索引有多少列。
key_len 大小的計算規(guī)則是:
一般地,key_len 等于索引列類型字節(jié)長度,例如int類型為4 bytes,bigint為8 bytes;如果是字符串類型,還需要同時考慮字符集因素,例如:CHAR(30) UTF8則key_len至少是90 bytes;若該列類型定義時允許NULL,其key_len還需要再加 1 bytes;若該列類型為變長類型,例如 VARCHAR(TEXT\BLOB不允許整列創(chuàng)建索引,如果創(chuàng)建部分索引也被視為動態(tài)列類型),其key_len還需要再加 2 bytes。
4.rows
表示的是掃描行數(shù)。
記住:該值是個預(yù)估值,所以并非是完全準(zhǔn)確的值。
MySQL 查詢優(yōu)化器根據(jù)統(tǒng)計信息,估算 SQL 要查找到結(jié)果集需要掃描讀取的數(shù)據(jù)行數(shù)。
原則上 rows 越少越好。
5.extra
該列會提示優(yōu)化執(zhí)行計劃的額外的信息。
注意,常見的不太友好的、值得大家關(guān)注的有如下幾種:
Using index。表示該sql利用覆蓋索引掃描,也即從只訪問索引即可獲取到所需的數(shù)據(jù),而不用回表。
Using where。表示該sql 回表獲取數(shù)據(jù)了。什么是回表呢? 其實就是僅僅通過訪問索引不能滿足獲取所需的數(shù)據(jù),需要訪問表的page 頁。
如果和Using index 同時出現(xiàn),說明where條件通過索引定位數(shù)據(jù),然后回表,再過濾所需要的數(shù)據(jù)。
Using filesort。說明排序沒有利用索引而發(fā)生了額外排序 ,伴隨著的可能還有Using temporary。
其實還有其他一些 提示Using MRR、Using index condition 、Using index for group-by,這些提示是正向的,說明sql比較優(yōu)化。
6.其它字段
前面講了5個比較重要的字段,相信很多求知欲強的小伙伴也想知道其它字段是什么意思,這里也一并列出來,以供參考:
字段
含義
查詢語句的序號或者說是標(biāo)識符
select_type
表是查詢的類型,常見的有如下6種
table
其值為表名或者表的別名,表示訪問哪一個表
partitions
匹配的分區(qū)
possible_keys
表示查詢時,可能使用的索引
filtered
按表條件過濾的行百分比
二、總結(jié)
本文基于一個最為簡單的案例講解了explain的執(zhí)行結(jié)果,最為重要的是5個字段,其它字段了解含義即可,希望對您有用~
總結(jié)
以上是生活随笔為你收集整理的mysql 多key索引_MYSQL的EXPLAIN到底多好用?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql的如何输入dateadd_my
- 下一篇: mysql 问号作用_什么是MySQL中