作者:
可愛(ài)豬豬
-帥鍋一枚
作者的網(wǎng)名很闊愛(ài),如果喜歡本文章一定要點(diǎn) 喜歡 或者 打賞,拜托~
作者一直在進(jìn)步,需要你們的支持和鼓勵(lì),謝謝!
人生理想:在程序猿界混出點(diǎn)名堂!
請(qǐng)讀者,認(rèn)真讀完這篇文章,一定可以解開(kāi)你心中多年的謎團(tuán)!
1.possible_keys
條件字段在索引中存在,則將該索引列出。
注意:如果用到了索引,也就是key不為空,但possible_keys為空,那么使用了覆蓋索引。
所謂覆蓋索引,就是查詢(xún)的時(shí)候select 的列就是索引字段。
2.key
使用的索引
這里使用的索引,并不代表一定用上了索引,用沒(méi)用索引,以及索引如何用的還要取決于type字段
3.key_len
索引字段的長(zhǎng)度,跟查詢(xún)的結(jié)果集無(wú)關(guān)。只是跟索引字段的定義的長(zhǎng)度有關(guān)。
這里需要搞懂兩個(gè)問(wèn)題:
如何計(jì)算索引長(zhǎng)度
我直接說(shuō)結(jié)果免的去看網(wǎng)上那么多測(cè)試和長(zhǎng)篇大論
一般數(shù)據(jù)庫(kù)采用utf-8,
varchar類(lèi)型的長(zhǎng)度為3*len+2
char類(lèi)型的長(zhǎng)度為3len
int類(lèi)型的長(zhǎng)度4
bigint的長(zhǎng)度是8
此外,如果是null,在以上的基礎(chǔ)+1,
題外話(huà):mysql建議字段設(shè)置為not null來(lái)節(jié)省空間,此外int(10)并不是說(shuō)占10個(gè)字節(jié)或者10位的長(zhǎng)度,而只是不滿(mǎn)10位填0,僅展示用
舉例:
utf-8下 a varchar(10) 長(zhǎng)度為3(utf-8)10+2(varchar)+1(null) = 33key_len的作用
主要看用的聯(lián)合索引的長(zhǎng)度,
對(duì)于聯(lián)合索引來(lái)說(shuō),只能根據(jù)type和key來(lái)判斷用沒(méi)有用上索引,用的哪個(gè)索引,但是索引用的哪個(gè)字段并推理不出,所以根據(jù)key_len和最左原則來(lái)推斷。
至于網(wǎng)上有些文章說(shuō)它越小越好,不一定有道理。比如聯(lián)合索引全部使用key_len就比較大,但性能就好。
4.type
表示是否用上索引,以及索引是如何使用的,此字段決定索引的性能。
先看結(jié)果,性能由低到高:
ALL<TYPE<RANGE<REF<CONST
- ALL:全表掃描
- TYPE:掃描全表的順序是按照索引順序掃描的
- RANGE:between或者“>”這種符號(hào)的時(shí)候會(huì)出現(xiàn)這個(gè)
- REF:
經(jīng)作者多次驗(yàn)證發(fā)現(xiàn)
,非唯一索引或者非主鍵,也就是你的查詢(xún)條件有可能返回多條結(jié)果,則為REF - CONST:
經(jīng)作者多次驗(yàn)證發(fā)現(xiàn)
,不管是聯(lián)合唯一索引還是主鍵,也就是你的查詢(xún)條件是唯一的,則為CONST
官方一點(diǎn)的解釋可參考這篇文章:
https://www.cnblogs.com/mydriverc/p/7086494.html
5.extra
以下兩個(gè)比較重要:
- using index:出現(xiàn)這個(gè)說(shuō)明mysql使用了覆蓋索引,避免訪問(wèn)了表的數(shù)據(jù)行,效率不錯(cuò)!通俗的說(shuō)也就是查詢(xún)的列不需要回表,在索引樹(shù)上就能拿到結(jié)果
- using where:這說(shuō)明服務(wù)器在存儲(chǔ)引擎收到行后將進(jìn)行過(guò)濾。有些where中的條件會(huì)有屬于索引的列,當(dāng)它讀取使用索引的時(shí)候,就會(huì)被過(guò)濾,所以會(huì)出現(xiàn)有些where語(yǔ)句并沒(méi)有在extra列中出現(xiàn)using where這么一個(gè)說(shuō)明。
微信公眾號(hào):可愛(ài)豬豬聊程序
,每天
連載更新,內(nèi)容易懂
、精彩不斷
。