一、mysql索引結(jié)構(gòu)
B+樹:
B樹是?個(gè)平衡的多叉樹,一個(gè)節(jié)點(diǎn)可以有多個(gè)數(shù)據(jù)內(nèi)容,這樣就不會(huì)出現(xiàn)二叉樹那樣數(shù)據(jù)龐大的時(shí)候,樹的高度比較高的情況,查詢的次數(shù)就會(huì)少,B+樹葉子節(jié)點(diǎn)間有指針相互鏈接,并且會(huì)維護(hù)了索引的順序的,所以有順序、有相鄰的引用,這樣在執(zhí)行范圍查找的時(shí)候,就可以左右移動(dòng),范圍查找的效率就會(huì)高很多。所以數(shù)據(jù)龐大的時(shí)候,B+樹被?泛使用,數(shù)據(jù)庫、?件系統(tǒng)等場(chǎng)景。
哈希索引:
哈希索引就是采??定的哈希算法,把鍵值換算成新的哈希值,檢索時(shí)不需要類似B+樹那樣從根節(jié)點(diǎn)到葉?節(jié)點(diǎn)逐級(jí)查找,只需?次哈希算法即可?刻定位到相應(yīng)的位置,速度?常快。
如果是等值查詢,那么哈希索引明顯有絕對(duì)優(yōu)勢(shì),因?yàn)橹恍枰?jīng)過?次算法即可找到相應(yīng)的鍵值;
前提是鍵值都是唯?的。如果鍵值不是唯?的,就需要先找到該鍵所在位置,然后再根據(jù)鏈表往后掃描,直 到找到相應(yīng)的數(shù)據(jù);
如果是范圍查詢檢索,這時(shí)候哈希索引就毫??武之地了,因?yàn)樵仁怯行虻逆I值,經(jīng)過哈希算法后,有可能變成不連續(xù)的了,就沒辦法再利?索引完成范圍查詢檢索;
哈希索引也沒辦法利?索引完成排序,以及l(fā)ike ‘xxx%’ 這樣的部分模糊查詢(這種部分模糊查詢,其實(shí)本質(zhì)上也是范圍查詢);
在有?量重復(fù)鍵值情況下,哈希索引的效率也是極低的,因?yàn)榇嬖诠E鲎矄栴}。
紅黑樹:
紅黑樹也可以查詢很快,都是紅黑樹在數(shù)據(jù)很多的情況下,樹的高度是很高的,所以也不用來做索引了。
普通二叉樹這就更加不行了,高度不說了,它還不會(huì)平衡。
如果123456這樣按照順序添加,1永遠(yuǎn)是跟節(jié)點(diǎn),依次增加就之后在樹的右邊加。
延伸閱讀:
二、索引及其優(yōu)缺點(diǎn)
索引本質(zhì):索引是數(shù)據(jù)結(jié)構(gòu)。這些數(shù)據(jù)結(jié)構(gòu)以某種方式指向數(shù)據(jù),這樣可以在這些數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上實(shí)現(xiàn)高效查找算法。
索引是在存儲(chǔ)引擎實(shí)現(xiàn)的,因此每種存儲(chǔ)引擎的索引不一定完全相同,并且每種存儲(chǔ)引擎不一定支持所有類型的索引。同時(shí)存儲(chǔ)引擎可以定義每個(gè)表的最大索引數(shù)和最大索引長度。所有存儲(chǔ)引擎支持每個(gè)表至少16個(gè)索引,總索引長度至少為256字節(jié)。
優(yōu)點(diǎn):
1、提高數(shù)據(jù)檢索的效率,降低數(shù)據(jù)庫的I/O成本
2、通過創(chuàng)建少數(shù)索引,可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的少數(shù)性
3、可以加速表和表之間的連接。對(duì)于有依賴關(guān)系的子表和父表聯(lián)合查詢時(shí),可以提高查詢速度
4、在使用分組和排序子句進(jìn)行數(shù)據(jù)查詢時(shí),可以顯著減少查詢中分組和排序的時(shí)間,降低CPU的消耗
缺點(diǎn):
1、創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間
2、索引需要占磁盤空間,存儲(chǔ)在磁盤上
3、雖然索引大大提高了查詢 速度,同時(shí)也會(huì)降低更新表的速度