回覆列表
  • 1 # 會點程式碼的大叔

    Btree索引和Hash索引

    我們平時用到的索引大部分是Btree索引,相信大家都比較熟悉,下面這個圖可以很清楚的描述什麼是Btree索引。

    而Hash索引是基於Hash表實現的,對於每一行資料,資料庫都會對每一個索引列計算一個Hash碼。

    Hash索引將所有的雜湊碼存起來,同時儲存指向每一行資料的指標。

    Hash索引優勢

    從上面兩幅圖可以看出來,Btree索引在查詢資料的時候,需要從根節點到枝節點,要一層一層地查詢,最後才能訪問表的行資料。所以當資料不斷的增多,索引的層數也會增加,這樣就導致查詢效率變慢,所以必要的時候需要進行索引重建。

    Hash索引檢索效率非常高,對於單行查詢的時間複雜度更低(除非有很多Hash衝突)。

    Hash索引劣勢

    可以看出來,Hash索引只儲存Hash值和指向行資料的指標(地址),所以無法直接使用索引中的值;而使用Btree索引的話:

    select username,age from user where id = ?

    當username,age,id是一個聯合索引的話,可以只查詢索引就能得到結果。

    Hash索引資料是無序的,所以也就無法用於排序。

    Hash索引只能進行等值查詢,比如=、in,不能進行範圍查詢。

    Hash索引不能利用部分索引鍵查詢。

    比如(username,gender)是一個Hash索引,那麼這樣的寫法是不能用到索引的:

    select * from user where username = ?

    Hash索引的Hash衝突很多的時候,維護成本很高。

    總結:Hash索引更適用於等值查詢,避免做排序、範圍查詢。

    相互學習,一起進步!

  • 2 # IT生涯

    基於雜湊表實現,只有精確匹配索引所有列的查詢才有效,對於每一行資料,儲存引擎都會對所有的索引列的值計算一個雜湊碼,雜湊碼是一個較小的值,並且不同鍵值的行計算出來的雜湊碼不一樣,雜湊索引將所有的雜湊碼儲存在索引中,同時在雜湊表中儲存指向每個資料行的指標。

  • 中秋節和大豐收的關聯?
  • 為何說美國DDG1000導彈驅逐艦是個失敗?