雜湊(hash)是一種非常快的尋找方法,一般情況下尋找的時間複雜度為O(1)。常用於串連(join)操作,如SQL
Server和Oracle中的雜湊串連(hash join)。但是SQL Server和Oracle等常見的資料庫並不支援雜湊索引(hash
index)。MySQL的Heap儲存引擎預設的索引類型為雜湊,而InnoDB儲存引擎提出了另一種實現方法,自適應雜湊索引(adaptive
hash index)。
InnoDB儲存引擎會監控對錶上索引的尋找,如果觀察到建立雜湊索引可以帶來速度的提升,則建立雜湊索引,所以稱之為自適應(adaptive)
的。自適應雜湊索引通過緩衝池的B+樹構造而來,因此建立的速度很快。而且不需要將整個表都建雜湊索引,InnoDB儲存引擎會自動根據訪問的頻率和模式
來為某些頁建立雜湊索引。
根據InnoDB的官方文檔顯示,啟用自適應雜湊索引後,讀取和寫入速度可以提高2倍;對於輔助索引的串連操作,效能可以提高5倍。在我看來,自適應雜湊索引是非常好的最佳化模式,其設計思想是資料庫自最佳化(self-tuning),即無需DBA對資料庫進行調整。
通過命令SHOW ENGINE INNODB STATUS可以看到當前自適應雜湊索引的使用狀況,如下所示:
- mysql> show engine innodb status\G;
- *************************** 1. row ***************************
- Status:
- =====================================
- 090922 11:52:51 INNODB MONITOR OUTPUT
- =====================================
- Per second averages calculated from the last 15 seconds
- ......
- -------------------------------------
- INSERT BUFFER AND ADAPTIVE HASH INDEX
- -------------------------------------
- Ibuf: size 2249, free list len 3346, seg size 5596,
- 374650 inserts, 51897 merged recs, 14300 merges
- Hash table size 4980499, node heap has 1246 buffer(s)
- 1640.60 hash searches/s, 3709.46 non-hash searches/s
- ......
現在可以看到自適應雜湊索引的使用資訊了,包括自適應雜湊索引的大小、使用方式、每秒使用自適應雜湊索引搜尋的情況。值得注意的是,雜湊索引只能用
來搜尋等值的查詢,如select * from table where index_col =
'xxx',而對於其他尋找類型,如範圍尋找,是不能使用的。因此,這裡出現了non-hash searches/s的情況。用hash
searches : non-hash searches命令可以大概瞭解使用雜湊索引後的效率。
由於自適應雜湊索引是由InnoDB儲存引擎控制的,所以這裡的資訊只供我們參考。不過我們可以通過參數innodb_adaptive_hash_index來禁用或啟動此特性,預設為開啟。