前言
今天重點說一下b-tree索引。文中的大部分圖都是盜取來的。
正文首先簡單的介紹一下什麼是b-tree:
一種適用於外查詢的樹,一種平衡的多叉樹並且具有以下的特點:
(一顆根節點最大為m個關鍵字的樹)
1、樹中每個節點最多有m個孩子;
2、除去根節點和葉子節點外,其他每個節點最少有m/2個孩子;
3、如果根節點不是葉子節點,則至少有2個孩子;
4、所有葉子節點都出現在同一層,葉子節點不包含任何關鍵字資訊;
5、所有非終端節點中包含有資訊(p0,k0,p1,k1,p3,…,ki,p(i+1)),其中:ki(i=0,1,2,…,m)為關鍵字,且ki大家可以參考這個**,圖中說的是b-tree的插入過程:
b+tree是在b-tree的基礎上發展來的。
差異:1、有m個子節點必然有m個關鍵碼;
2、非葉子節點僅具有索引作用,跟記錄有關的資訊均存放在葉子節點中;
3、樹的所有葉節點構成乙個有序鍊錶,可以按照關鍵碼排序的次序遍歷全部記錄。
如圖所示:
下邊的圖是b+tree的插入**:
通過上邊的簡單介紹應該對兩種型別的樹有了認識。mysql中使用的是哪種結構呢?通過查詢各種資料然後彙總如下:
比b樹更適合作為索引的結構是b+樹。mysql中也是使用b+樹作為索引。
b樹:有序陣列+平衡多叉樹;
b+樹:有序陣列鍊錶+平衡多叉樹;
b+樹的關鍵字全部存放在葉子節點中,非葉子節點用來做索引,而葉子節點中有乙個指標指向一下個葉子節點。做這個優化的目的是為了提高區間訪問的效能。而正是這個特性決定了b+樹更適合用來儲存外部資料。
資料庫索引採用b+樹的主要原因是b樹在提高了磁碟io效能的同時並沒有解決元素遍歷的效率低下的問題。正是為了解決這個問題,b+樹應運而生。b+樹只要遍歷葉子節點就可以實現整棵樹的遍歷。而且在資料庫中基於範圍的查詢是非常頻繁的,而b樹不支援這樣的操作(或者說效率太低)。
正如上面所說,在資料庫中基於範圍的查詢是非常頻繁的,因此mysql最終選擇的索引結構是b+樹而不是b樹(這句話可能不是很嚴謹)。
結束其實在mysql中不同儲存引擎對索引的實現方式是不同的,myisam和innodb兩個儲存引擎的索引實現方式。
1、myisam引擎使用b+tree作為索引結構
2、雖然innodb也使用b+tree作為索引結構,但具體實現方式卻與myisam截然不同。(詳細的內容可以搜尋:mysql索引背後的資料結構及演算法原理)
**引用的csdn部落格:**演算法和資料結構: 十 平衡查詢樹之b樹
還有一篇寫的比較詳細的部落格:btree和b+tree詳解
mysql多索引結構 MySQL 索引結構詳解
innodb的主鍵索引 primary key 是cluster形式的 聚簇索引 innodb的非主鍵索引 secondary index 是普通的b tree索引。兩種索引在root node和branch node是一樣的,在leaf node就不一樣了。primary key存放的是表的實際資...
MySQL索引結構
b 樹有如下特點 所有鍵值分布在整顆樹中 任何乙個關鍵字出現且只出現在乙個結點中 搜尋有可能在非葉子結點結束 在關鍵字全集內做一次查詢,效能逼近二分查詢 b 樹是b 樹的變體,也是一種多路搜尋樹,它與 b 樹的不同之處在於 所有關鍵字儲存在葉子節點出現,內部節點 非葉子節點並不儲存真正的 data ...
mysql not 索引 MySQL 索引結構
為資料表增加索引 index 可以提公升mysql資料查詢效率。mysql中所有型別的資料字段都可以有索引。索引指向了資料表中的記錄 行 可以快速判斷某行記錄是否符合 where 語句中的限定條件。但是索引並不是越多越好 索引需要耗費儲存空間 索引越多,mysql在決定採用哪個索引時也會消耗更多時間...