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

2022-03-29 04:25:11 字數 1814 閱讀 4999

在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) usingbtree,

key (username(12)) usingbtree— 此處 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 ...