溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL索引底層是怎么實(shí)現(xiàn)的

發(fā)布時間:2021-12-04 14:39:54 來源:億速云 閱讀:269 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“MySQL索引底層是怎么實(shí)現(xiàn)的”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“MySQL索引底層是怎么實(shí)現(xiàn)的”吧!

索引是什么?

索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。

索引能干什么?

提高數(shù)據(jù)查詢的效率。

索引:排好序的快速查找數(shù)據(jù)結(jié)構(gòu)!索引會影響where后面的查找,和order by 后面的排序。

一、索引的分類

1??從存儲結(jié)構(gòu)上來劃分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。

2??從應(yīng)用層次來分:普通索引,唯一索引,復(fù)合索引

3??根據(jù)中數(shù)據(jù)的物理順序與鍵值的邏輯(索引)順序關(guān)系:聚集索引,非聚集索引。

1??中所描述的是索引存儲時保存的形式,

2??是索引使用過程中進(jìn)行的分類,兩者是不同層次上的劃分。不過平時講的索引類型一般是指在應(yīng)用層次的劃分。

就像手機(jī)分類:安卓手機(jī),IOS手機(jī) 與 華為手機(jī),蘋果手機(jī),OPPO手機(jī)一樣。

普通索引:即一個索引只包含單個列,一個表可以有多個單列索引

唯一索引:索引列的值必須唯一,但允許有空值

復(fù)合索引:即一個索引包含多個列

聚簇索引(聚集索引):并不是一種單獨(dú)的索引類型,而是一種數(shù)據(jù)存儲方式。具體細(xì)節(jié)取決于不同的實(shí)現(xiàn),InnoDB的聚簇索引其實(shí)就是在同一個結(jié)構(gòu)中保存了B-Tree索引(技術(shù)上來說是B+Tree)和數(shù)據(jù)行。

非聚簇索引:不是聚簇索引,就是非聚簇索引(認(rèn)真臉)。

二、索引的底層實(shí)現(xiàn)

mysql默認(rèn)存儲引擎innodb只顯式支持B-Tree( 從技術(shù)上來說是B+Tree)索引,對于頻繁訪問的表,innodb會透明建立自適應(yīng)hash索引,即在B樹索引基礎(chǔ)上建立hash索引,可以顯著提高查找效率,對于客戶端是透明的,不可控制的,隱式的。

不談存儲引擎,只討論實(shí)現(xiàn)(抽象)

Hash索引

基于哈希表實(shí)現(xiàn),只有精確匹配索引所有列的查詢才有效,對于每一行數(shù)據(jù),存儲引擎都會對所有的索引列計(jì)算一個哈希碼(hash code),并且Hash索引將所有的哈希碼存儲在索引中,同時在索引表中保存指向每個數(shù)據(jù)行的指針。

MySQL索引底層是怎么實(shí)現(xiàn)的

B-Tree索引(MySQL使用B+Tree)B-Tree能加快數(shù)據(jù)的訪問速度,因?yàn)榇鎯σ娌辉傩枰M(jìn)行全表掃描來獲取數(shù)據(jù),數(shù)據(jù)分布在各個節(jié)點(diǎn)之中。

MySQL索引底層是怎么實(shí)現(xiàn)的

B+Tree索引

是B-Tree的改進(jìn)版本,同時也是數(shù)據(jù)庫索引索引所采用的存儲結(jié)構(gòu)。

數(shù)據(jù)都在葉子節(jié)點(diǎn)上,并且增加了順序訪問指針,每個葉子節(jié)點(diǎn)都指向相鄰的葉子節(jié)點(diǎn)的地址。

相比B-Tree來說,進(jìn)行范圍查找時只需要查找兩個節(jié)點(diǎn),進(jìn)行遍歷即可。而B-Tree需要獲取所有節(jié)點(diǎn),相比之下B+Tree效率更高。

MySQL索引底層是怎么實(shí)現(xiàn)的結(jié)合存儲引擎來討論(一般默認(rèn)使用B+Tree)

案例:假設(shè)有一張學(xué)生表,id為主鍵

MySQL索引底層是怎么實(shí)現(xiàn)的

在MyISAM引擎中的實(shí)現(xiàn)(二級索引也是這樣實(shí)現(xiàn)的)

MySQL索引底層是怎么實(shí)現(xiàn)的

在InnoDB中的實(shí)現(xiàn)

MySQL索引底層是怎么實(shí)現(xiàn)的

MySQL索引底層是怎么實(shí)現(xiàn)的

三、問題

問:為什么索引結(jié)構(gòu)默認(rèn)使用B-Tree,而不是hash,二叉樹,紅黑樹?

hash:雖然可以快速定位,但是沒有順序,IO復(fù)雜度高。

二叉樹:樹的高度不均勻,不能自平衡,查找效率跟數(shù)據(jù)有關(guān)(樹的高度),并且IO代價高。

紅黑樹:樹的高度隨著數(shù)據(jù)量增加而增加,IO代價高。

問:為什么官方建議使用自增長主鍵作為索引。

結(jié)合B+Tree的特點(diǎn),自增主鍵是連續(xù)的,在插入過程中盡量減少頁分裂,即使要進(jìn)行頁分裂,也只會分裂很少一部分。并且能減少數(shù)據(jù)的移動,每次插入都是插入到最后??傊褪菧p少分裂和移動的頻率。

插入連續(xù)的數(shù)據(jù):

MySQL索引底層是怎么實(shí)現(xiàn)的

插入非連續(xù)的數(shù)據(jù)

MySQL索引底層是怎么實(shí)現(xiàn)的

感謝各位的閱讀,以上就是“MySQL索引底層是怎么實(shí)現(xiàn)的”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對MySQL索引底層是怎么實(shí)現(xiàn)的這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI