溫馨提示×

溫馨提示×

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

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

MySQL InnoDB存儲引擎體系架構(gòu)支持的索引是什么

發(fā)布時間:2021-10-25 09:40:14 來源:億速云 閱讀:291 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了MySQL InnoDB存儲引擎體系架構(gòu)支持的索引是什么,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

眾所周知,在MySQL的InnoDB引擎,為了提高查詢速度,可以在字段上添加索引,索引就像一本書的目錄,通過目錄來定位書中的內(nèi)容在哪一頁。

 InnoDB支持的索引有如下幾種:

  • B+樹索引

  • 全文索引

  • 哈希索引

重點(diǎn)介紹B+樹索引。

一、數(shù)據(jù)結(jié)構(gòu)——B+樹

        相信大家在大學(xué)的數(shù)據(jù)結(jié)構(gòu)的課程中都學(xué)過二分查找、二叉樹和平衡二叉樹。在一組有序的數(shù)據(jù)中,利用二分查找可以在log2N的復(fù)雜度中快速檢索數(shù)據(jù),平衡二叉樹是在二叉查找樹的基礎(chǔ)上演變而來,解決了二叉查找樹在極端情況下轉(zhuǎn)化為單鏈表的問題。而B+樹呢?讓我們來看B+樹的結(jié)構(gòu)

MySQL InnoDB存儲引擎體系架構(gòu)支持的索引是什么

在B+樹中,數(shù)據(jù)都是按照從下到大的順序存放在葉子節(jié)點(diǎn)中,由上圖的B+樹可得出,這顆B+樹的高度為2,每頁可存儲4條數(shù)據(jù),扇出為5,第一層是索引頁,第二層是數(shù)據(jù)頁。數(shù)據(jù)庫B+樹索引的本質(zhì)就是B+樹在數(shù)據(jù)庫中的實(shí)現(xiàn),并且B+樹的高度一般限制在2-4層,磁盤的IO操作只需要2-4次,所以在索引上查找數(shù)據(jù),速度很快。

二、B+樹索引

1、聚集索引

        在InnoDB引擎中,都有一個聚集索引,一般是primary key,若用戶沒有顯示指定primary key,InnoDB會默認(rèn)選擇表的第一個not null的unique索引為主鍵,若沒有,則會自動創(chuàng)建一個6字節(jié)大小的_rowid作為主鍵。

MySQL InnoDB存儲引擎體系架構(gòu)支持的索引是什么

上圖是一張聚集索引的示意圖,由上圖,我們可以看到,該樹分為兩層,同樣第一層是索引頁,第二層是數(shù)據(jù)頁,實(shí)實(shí)在在存放數(shù)據(jù)的地方。我們還可以得出,索引頁存放的并不是數(shù)據(jù)而是指向真實(shí)數(shù)據(jù)的一個偏移量,而真實(shí)數(shù)據(jù)存放在第二層的數(shù)據(jù)頁,所以如果一條SQL語句命中索引,只是命中了索引頁的數(shù)據(jù),然后通過索引頁找到真實(shí)數(shù)據(jù)所在的頁。

        聚集索引的存儲在物理上不是連續(xù)的,在邏輯上卻是連續(xù)的,這是因?yàn)轫撆c頁是通過雙向鏈表維護(hù)的,而每頁中行記錄也是通過雙向鏈表維護(hù)。為什么要雙向鏈表??這是因?yàn)榉奖惴秶樵兒团判颍邕^找到某個索引所在數(shù)據(jù)頁的偏移量,直接遍歷這個鏈表或者逆序遍歷這個鏈表,便可以方便的進(jìn)行范圍查詢和逆序排序。比如

select * from table where id>10 and id<1000;

2、輔助索引

        InnoDB的另一種索引,輔助索引,也叫二級索引或非聚集索引。對于輔助索引,葉子并不包含行記錄的全部數(shù)據(jù),葉子節(jié)點(diǎn)除了包含鍵值外,還包含了一個被稱作“書簽”的東西,該書簽用來告訴InnoDB到哪里可以找到所需的行的數(shù)據(jù),所以書簽實(shí)際存放的是聚集索引,所以如果SQL命中了輔助索引,查詢流程分為兩步:

1、找到索引頁

2、通過索引頁找到數(shù)據(jù)頁,該數(shù)據(jù)頁包含聚集索引的的值

3、通過聚集索引找到行記錄

所以,輔助索引一般比聚集索引多一次IO。

MySQL InnoDB存儲引擎體系架構(gòu)支持的索引是什么

一個很容易被DBA忽略的問題:如果一條SQL語句命中索引,B+樹索引不能找到一個給定查詢條件的具體行,只能找到被查詢數(shù)據(jù)行所在的頁,然后將這個數(shù)據(jù)讀入內(nèi)存,然后再內(nèi)存中遍歷所有行找到數(shù)據(jù)。另外,每一頁大小為16k,每一頁會包含多行,行與行之間是通過雙向鏈表組織的,所以范圍查詢或者順序倒序排序查詢時,只需遍歷鏈表就可以了。

上述內(nèi)容就是MySQL InnoDB存儲引擎體系架構(gòu)支持的索引是什么,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向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