哈希(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來禁用或啟動此特性,默認為開啟。
轉自http://www.cnblogs.com/ylqmf/archive/2011/09/16/2179166.html