前幾天看了一個(gè)mysql索引的視頻,一直沒(méi)有整理,今天突然想到在博客中記錄一下,僅做自己記錄整理用,如果對(duì)您有幫助那再好不過(guò)!
什么是索引?
索引是幫助mysql高效獲取數(shù)據(jù)的排好序的數(shù)據(jù)結(jié)構(gòu)
例如有如下的表:

如果索引的數(shù)據(jù)結(jié)構(gòu)是二叉樹(shù)的話,索引在col2上,那么可能是這種情況:

如果索引的數(shù)據(jù)結(jié)構(gòu)是二叉樹(shù)的話,索引在col1上,那么就是這種情況:

成為了這種線性結(jié)構(gòu),二叉樹(shù)的深度是不可控的,這樣會(huì)增加磁盤(pán)I/O的次數(shù),降低查詢效率。那么我們用紅黑樹(shù)替代

雖然紅黑樹(shù)能夠自動(dòng)平衡,但是實(shí)際上樹(shù)的高度還是不能夠控制。這時(shí)候就用到了B-tree

類似這種,將節(jié)點(diǎn)的容量擴(kuò)大,從而達(dá)到降低樹(shù)的深度的目的來(lái)減少I/O操作。將節(jié)點(diǎn)數(shù)據(jù)讀取到內(nèi)存中查找遠(yuǎn)比一次I/O的時(shí)間少。B-tree的特點(diǎn)就是每層節(jié)點(diǎn)數(shù)目非常多,層數(shù)很少。但是每個(gè)節(jié)點(diǎn)都是data域(指針)這無(wú)疑增大了節(jié)點(diǎn)大小,增加了磁盤(pán)I/O的時(shí)間,那么接下來(lái)就是mysql最終確定的B+tree,B+tree將所有的data都放到了葉子結(jié)點(diǎn)上
B+tree在不同引擎下的表現(xiàn)
MyISAM索引實(shí)現(xiàn),MyISAM索引文件和數(shù)據(jù)文件是分離的
.frm -->表結(jié)構(gòu);
.MYI-->索引數(shù)據(jù);
MYD-->數(shù)據(jù)
InnoDB索引和數(shù)據(jù)在一起
.frm-->表結(jié)構(gòu);
.ibd(index,data)
Innodb必須有主鍵,推薦使用整型。如果建表沒(méi)有建,mysql也會(huì)主動(dòng)建。
為什么要用整型?
1、在查找索引比較大小時(shí),整型要比字符串更方便;
2、字符串不管是在磁盤(pán)中還是內(nèi)存中都要比整型更占內(nèi)存;
為什么自增?
好維護(hù)索引數(shù)據(jù)。新增一條數(shù)據(jù),如果不是自增會(huì)發(fā)生裂變
索引數(shù)據(jù)結(jié)構(gòu)如果采用hash,用hash表存儲(chǔ)索引與數(shù)據(jù)的對(duì)應(yīng)關(guān)系,查找更快,但是當(dāng)條件出現(xiàn)范圍,如>用不到索引
如果內(nèi)容對(duì)大家有所幫助,感謝大家打賞鼓勵(lì)!
?