中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

MySQL InnoDB存儲引擎體系架構支持的索引是什么

發布時間:2021-10-25 09:40:14 來源:億速云 閱讀:298 作者:柒染 欄目:大數據

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

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

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

  • B+樹索引

  • 全文索引

  • 哈希索引

重點介紹B+樹索引。

一、數據結構——B+樹

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

MySQL InnoDB存儲引擎體系架構支持的索引是什么

在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作為主鍵。

MySQL InnoDB存儲引擎體系架構支持的索引是什么

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

        聚集索引的存儲在物理上不是連續的,在邏輯上卻是連續的,這是因為頁與頁是通過雙向鏈表維護的,而每頁中行記錄也是通過雙向鏈表維護。為什么要雙向鏈表??這是因為方便范圍查詢和排序,如過找到某個索引所在數據頁的偏移量,直接遍歷這個鏈表或者逆序遍歷這個鏈表,便可以方便的進行范圍查詢和逆序排序。比如

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

2、輔助索引

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

1、找到索引頁

2、通過索引頁找到數據頁,該數據頁包含聚集索引的的值

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

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

MySQL InnoDB存儲引擎體系架構支持的索引是什么

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

依兰县| 新兴县| 古蔺县| 中宁县| 沿河| 平度市| 莒南县| 梅河口市| 镇安县| 江西省| 富顺县| 兴仁县| 娄烦县| 梅州市| 阳江市| 贵州省| 灵川县| 武定县| 资阳市| 兴隆县| 仁布县| 祁东县| 南昌市| 江孜县| 泰安市| 土默特左旗| 博罗县| 吕梁市| 榆林市| 竹溪县| 西吉县| 宜春市| 吉木萨尔县| 克拉玛依市| 商城县| 肃宁县| 锡林郭勒盟| 宜君县| 瑞丽市| 辛集市| 沁源县|