您好,登錄后才能下訂單哦!
本篇文章為大家展示了MySQL InnoDB存儲引擎體系架構支持的索引是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
眾所周知,在MySQL的InnoDB引擎,為了提高查詢速度,可以在字段上添加索引,索引就像一本書的目錄,通過目錄來定位書中的內容在哪一頁。
InnoDB支持的索引有如下幾種:
B+樹索引
全文索引
哈希索引
重點介紹B+樹索引。
一、數據結構——B+樹
相信大家在大學的數據結構的課程中都學過二分查找、二叉樹和平衡二叉樹。在一組有序的數據中,利用二分查找可以在log2N的復雜度中快速檢索數據,平衡二叉樹是在二叉查找樹的基礎上演變而來,解決了二叉查找樹在極端情況下轉化為單鏈表的問題。而B+樹呢?讓我們來看B+樹的結構
在B+樹中,數據都是按照從下到大的順序存放在葉子節點中,由上圖的B+樹可得出,這顆B+樹的高度為2,每頁可存儲4條數據,扇出為5,第一層是索引頁,第二層是數據頁。數據庫B+樹索引的本質就是B+樹在數據庫中的實現,并且B+樹的高度一般限制在2-4層,磁盤的IO操作只需要2-4次,所以在索引上查找數據,速度很快。
二、B+樹索引
1、聚集索引
在InnoDB引擎中,都有一個聚集索引,一般是primary key,若用戶沒有顯示指定primary key,InnoDB會默認選擇表的第一個not null的unique索引為主鍵,若沒有,則會自動創建一個6字節大小的_rowid作為主鍵。
上圖是一張聚集索引的示意圖,由上圖,我們可以看到,該樹分為兩層,同樣第一層是索引頁,第二層是數據頁,實實在在存放數據的地方。我們還可以得出,索引頁存放的并不是數據而是指向真實數據的一個偏移量,而真實數據存放在第二層的數據頁,所以如果一條SQL語句命中索引,只是命中了索引頁的數據,然后通過索引頁找到真實數據所在的頁。
聚集索引的存儲在物理上不是連續的,在邏輯上卻是連續的,這是因為頁與頁是通過雙向鏈表維護的,而每頁中行記錄也是通過雙向鏈表維護。為什么要雙向鏈表??這是因為方便范圍查詢和排序,如過找到某個索引所在數據頁的偏移量,直接遍歷這個鏈表或者逆序遍歷這個鏈表,便可以方便的進行范圍查詢和逆序排序。比如
select * from table where id>10 and id<1000;
2、輔助索引
InnoDB的另一種索引,輔助索引,也叫二級索引或非聚集索引。對于輔助索引,葉子并不包含行記錄的全部數據,葉子節點除了包含鍵值外,還包含了一個被稱作“書簽”的東西,該書簽用來告訴InnoDB到哪里可以找到所需的行的數據,所以書簽實際存放的是聚集索引,所以如果SQL命中了輔助索引,查詢流程分為兩步:
1、找到索引頁
2、通過索引頁找到數據頁,該數據頁包含聚集索引的的值
3、通過聚集索引找到行記錄
所以,輔助索引一般比聚集索引多一次IO。
一個很容易被DBA忽略的問題:如果一條SQL語句命中索引,B+樹索引不能找到一個給定查詢條件的具體行,只能找到被查詢數據行所在的頁,然后將這個數據讀入內存,然后再內存中遍歷所有行找到數據。另外,每一頁大小為16k,每一頁會包含多行,行與行之間是通過雙向鏈表組織的,所以范圍查詢或者順序倒序排序查詢時,只需遍歷鏈表就可以了。
上述內容就是MySQL InnoDB存儲引擎體系架構支持的索引是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。