目錄
為什麼是b+樹而不是b樹?
首先看看b樹和b+樹在結構上的區別
b樹結構:
b+樹:
可以看到:
首先需要了解聚簇索引和非聚簇索引。
聚簇索引:
在聚簇索引中,葉子頁包含了行的全部資料,節點頁值包含索引列。innodb通過主鍵聚集資料,如果沒有定義主鍵則選擇乙個唯一的非空索引列代替;如果沒有這樣的索引,innodb會隱式定義乙個主鍵來作為聚簇索引。
聚簇索引的資料分布:
在聚簇索引中,除了主鍵索引,還有二級索引。二級索引中的葉子節點儲存的不是「行指標」,而是主鍵值,並以此作為指向行的「指標」。這意味著通過二級索引查詢行,儲存引擎需要找到二級索引的葉子節點獲得對應的主鍵值,然後根據這個值去聚簇索引中查詢對應的行,也稱為「回表」。當然,可以通過覆蓋索引避免回表或者innodb的自適應索引能夠減少這樣的重複工作。
注意:聚簇索引中每乙個葉子節點不止包含完整的資料行,還包括事務id、用於事務和mvcc的回滾指標。
非聚簇索引的主鍵索引和二級索引在結構上沒有什麼不同,都在葉子節點上儲存指向資料的實體地址的「行指標」。
聚簇索引的主鍵索引和二級索引:
非聚簇索引的主鍵索引和二級索引:
優點:把相關資料儲存在一起(比如用使用者id把使用者的全部郵件聚集在一起),否則每次資料讀取就可能導致一次磁碟io
資料訪問更快,把索引和資料儲存在同乙個b+樹中,通常在聚簇索引中獲取資料比在非聚簇索引中查詢更快
使用覆蓋查詢可以直接利用頁節點中的主鍵值
缺點:如果所有資料都可以放在記憶體中,順序訪問不再那麼必要,聚簇索引沒有優勢
插入速度依賴於插入順序,隨機插入會導致頁**,造成空洞,使用optimize table重建表
每次插入、更新、刪除都需要維護索引的變化,代價很高
二級索引可能比想象中大,因為在節點中包含了引用行的主鍵列
雜湊索引基於雜湊表實現,只有精確匹配索引所有列的查詢才有效,這意味著,雜湊索引適用於等值查詢。
具體實現:對於每一行資料,儲存引擎都會對所有的索引列計算乙個雜湊碼,雜湊索引將所有的雜湊碼儲存在索引中,同時在雜湊表中儲存指向每個資料行的指標。
在mysql中,只有memory引擎顯式支援雜湊索引,當然memory引擎也支援b樹索引。
注意:memory引擎支援非唯一雜湊索引,解決衝突的方式是以鍊錶的形式存放多個雜湊值相同的記錄指標。
innodb注意到某些索程式設計客棧引值被使用得非常頻繁時,會在記憶體中基於b+樹索引之上再建立乙個雜湊索引,這樣就讓b+樹索引也具有雜湊索引的一些優點,比如快速的雜湊查詢。
Mysql索引底層資料結構
想要了解索引,首先要知道索引到底是什麼呢 索引是幫助mysql高效獲取資料的排好序的資料結構 通俗來講就好比喻一本書,那這本書的目錄就好比做索引 索引儲存在檔案裡 儲存引擎是myisam的索引檔案儲存在 myi檔案中,儲存引擎是innodb的索引檔案儲存在 idb檔案中 通常資料庫中的資料就是存在硬...
索引的底層資料結構
索引的底層資料結構有 1 樹tree,準確的說是b 樹 2 hash 時間複雜度對比 hash的時間o 1 tree的o logn 為什麼索引採用b 樹,而不採用hash這種結構?hash這種結構對與獲取單條記錄時的查詢效率是要比b 樹效率要高的,但是對與資料的範圍查詢效率就很低,特別是對於資料量大...
MySql索引底層資料結構與演算法
一 索引資料結構 索引是幫助mysql高效獲取資料的排好序的資料結構 二叉樹 特點 左子樹小於右子樹 缺點 如果儲存自增資料,二叉樹會退化成煉表,查詢效率低 紅黑樹 特點 自平衡二叉樹,樹高相對平衡,不會出現極端情況 性質1.節點是紅色或黑色。性質2.根節點是黑色。性質3.所有葉子都是黑色。葉子是n...