MySQL B 樹索引和雜湊索引的區別

2021-08-21 06:33:27 字數 1670 閱讀 3612

在mysql裡常用的索引資料結構有b+樹索引和雜湊索引兩種,我們來看下這兩種索引資料結構的區別及其不同的應用建議。

備註:先說下,在mysql文件裡,實際上是把b+樹索引寫成了btree,例如像下面這樣的寫法:

create table t(

aid int unsigned not null auto_increment,

userid int unsigned not null default 0,

username varchar(20) not null default 『』,

detail varchar(255) not null default 『』,

primary key(aid),

unique key(uid) using btree,

key (username(12)) using btree — 此處 uname 列只建立了最左12個字元長度的部分索引

)engine=innodb;

乙個經典的b+樹索引資料結構見下圖:

(源自網路)

b+樹是乙個平衡的多叉樹,從根節點到每個葉子節點的高度差值不超過1,而且同層級的節點間有指標相互鏈結。

在b+樹上的常規檢索,從根節點到葉子節點的搜尋效率基本相當,不會出現大幅波動,而且基於索引的順序掃瞄時,也可以利用雙向指標快速左右移動,效率非常高。

因此,b+樹索引被廣泛應用於資料庫、檔案系統等場景。順便說一下,xfs檔案系統比ext3/ext4效率高很多的原因之一就是,它的檔案及目錄索引結構全部採用b+樹索引,而ext3/ext4的檔案目錄結構則採用linked list, hashed b-tree、extents/bitmap等索引資料結構,因此在高i/o壓力下,其iops能力不如xfs。

詳細可參見:

而雜湊索引的示意圖則是這樣的:

(源自網路)

簡單地說,雜湊索引就是採用一定的雜湊演算法,把鍵值換算成新的雜湊值,檢索時不需要類似b+樹那樣從根節點到葉子節點逐級查詢,只需一次雜湊演算法即可立刻定位到相應的位置,速度非常快。

從上面的圖來看,b+樹索引和雜湊索引的明顯區別是:

在mysql中,只有heap/memory引擎表才能顯式支援雜湊索引(ndb也支援,但這個不常用),innodb引擎的自適應雜湊索引(adaptive hash index)不在此列,因為這不是建立索引時可指定的。

還需要注意到:heap/memory引擎表在mysql例項重啟後,資料會丟失。

通常,b+樹索引結構適用於絕大多數場景,像下面這種場景用雜湊索引才更有優勢:

在heap表中,如果儲存的資料重複度很低(也就是說基數很大),對該列資料以等值查詢為主,沒有範圍查詢、沒有排序的時候,特別適合採用雜湊索引

例如這種sql:

select … from t where c1 = ?; — 僅等值查詢

在大多數場景下,都會有範圍查詢、排序、分組等查詢特徵,用b+樹索引就可以了。

2023年9.12日 京東二面的問題。

MySQL B 樹索引和雜湊索引的區別

在mysql裡常用的索引資料結構有b 樹索引和雜湊索引兩種,我們來看下這兩種索引資料結構的區別及其不同的應用建議。備註 先說下,在mysql文件裡,實際上是把b 樹索引寫成了btree 例如像下面這樣的寫法 create table t aid int unsigned not null auto ...

MySQL B 樹索引和雜湊索引的區別

在mysql裡常用的索引資料結構有b 樹索引和雜湊索引兩種,我們來看下這兩種索引資料結構的區別及其不同的應用建議。備註 先說下,在mysql文件裡,實際上是把b 樹索引寫成了btree,例如像下面這樣的寫法 create table t aid int unsigned not null auto ...

MySQL B 樹索引和雜湊索引的區別

在mysql裡常用的索引資料結構有b 樹索引和雜湊索引兩種,我們來看下這兩種索引資料結構的區別及其不同的應用建議。備註 先說下,在mysql文件裡,實際上是把b 樹索引寫成了btree,例如像下面這樣的寫法 create table t aid int unsigned not null auto ...