在mysql裡常用的索引資料結構有b+樹索引和雜湊索引兩種,我們來看下這兩種索引資料結構的區別及其不同的應用建議。備註:先說下,在mysql文件裡,實際上是把b+樹索引寫成了btree,例如像下面這樣的寫法:
create table t(乙個經典的b+樹索引資料結構見下圖: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+樹是乙個平衡的多叉樹,從根節點到每個葉子節點的高度差值不超過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表中,如果儲存的資料重複度很低(也就是說基數很大),對該列資料以等值查詢為主,沒有範圍查詢、沒有排序的時候,特別適合採用雜湊索引在大多數場景下,都會有範圍查詢、排序、分組等查詢特徵,用b+樹索引就可以了。例如這種sql:
select … from t where c1 = ?; — 僅等值查詢
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 ...