1. 程式人生 > >btree和hash索引的區別

btree和hash索引的區別

至於Btree索引,它是以B+樹為儲存結構實現的。

但是Btree索引的儲存結構在Innodb和MyISAM中有很大區別。

在MyISAM中,我們如果要對某張表的某列建立Btree索引的話,如圖:


所以我們經常會說MyISAM資料檔案和索引檔案是分開的。

因此MyISAM的索引方式也稱為非聚集,Innodb的索引方式成為聚集索引。

至於輔助索引,類似於主索引,唯一區別就是主索引上的值不能重複,而輔助索引可以重複。


因此當我們根據Btree索引去搜索的時候,若key存在,在data域找到其地址,然後根據地址去表中查詢資料記錄。

至於Innodb它跟上面又有很大不同,它的葉子節點儲存的並不是表的地址,而是資料


我們可以看到這裡並沒有將地址放入葉子節點,而是直接放入了對應的資料,這也就是我們平常說到的,Innodb的索引檔案就是資料檔案,

那麼對於Innodb的輔助索引結構跟主索引也相差很多,如圖:


我們可以發現,這裡葉子節點儲存的是主鍵的資訊,所以我們在利用輔助索引的時候,檢索到主鍵資訊,然後再通過主鍵去主索引中定位表中的資料,這就可以說明Innodb中主鍵之所以不宜用過長的欄位,由於所有的輔助索引都包含主索引,所以很容易讓輔助索引變得龐大。

我們還可以發現:在Innodb中儘量使用自增的主鍵,這樣每次增加資料時只需要在後面新增即可,非單調的主鍵在插入時會需要維持B+tree特性而進行分裂調整,十分低效。