在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(userid) usingbtree,
key (username(12)) usingbtree— 此處 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 = ?; — 僅等值查詢
雜湊索引和B 樹索引
在理想的情況下,key非常分散,不存在hash碰撞的話,採用hash索引可以唯一得確定乙個key的位置,並且這個位置上就只有乙個key,所以查詢時間複雜度是o 1 非常快,這是hash索引的最主要優勢。但是呢,hash索引不是沒有缺點,不存在hash碰撞這是理想情況,通常情況下,同乙個hash值都不...
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 ...