哈希(hash)是一種非常快的查找方法,一般情況下查找的時(shí)間復(fù)雜度為O(1)。常用于連接(join)操作,如SQL Server和Oracle中的哈希連接(hash join)。但是SQL Server和Oracle等常見(jiàn)的數(shù)據(jù)庫(kù)并不支持哈希索引(hash index)。MySQL的Heap存儲(chǔ)引擎默認(rèn)的索引類型為哈希,而InnoDB存儲(chǔ)引擎提出了另一種實(shí)現(xiàn)方法,自適應(yīng)哈希索引(adaptive hash index)。
InnoDB存儲(chǔ)引擎會(huì)監(jiān)控對(duì)表上索引的查找,如果觀察到建立哈希索引可以帶來(lái)速度的提升,則建立哈希索引,所以稱之為自適應(yīng)(adaptive)的。自適應(yīng)哈希索引通過(guò)緩沖池的B+樹(shù)構(gòu)造而來(lái),因此建立的速度很快。而且不需要將整個(gè)表都建哈希索引,InnoDB存儲(chǔ)引擎會(huì)自動(dòng)根據(jù)訪問(wèn)的頻率和模式來(lái)為某些頁(yè)建立哈希索引。
根據(jù)InnoDB的官方文檔顯示,啟用自適應(yīng)哈希索引后,讀取和寫(xiě)入速度可以提高2倍;對(duì)于輔助索引的連接操作,性能可以提高5倍。在我看來(lái),自適應(yīng)哈希索引是非常好的優(yōu)化模式,其設(shè)計(jì)思想是數(shù)據(jù)庫(kù)自優(yōu)化(self-tuning),即無(wú)需DBA對(duì)數(shù)據(jù)庫(kù)進(jìn)行調(diào)整。
通過(guò)命令SHOW ENGINE INNODB STATUS可以看到當(dāng)前自適應(yīng)哈希索引的使用狀況,如下所示:
- 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
- ......
現(xiàn)在可以看到自適應(yīng)哈希索引的使用信息了,包括自適應(yīng)哈希索引的大小、使用情況、每秒使用自適應(yīng)哈希索引搜索的情況。值得注意的是,哈希索引只能用來(lái)搜索等值的查詢,如select * from table where index_col = 'xxx',而對(duì)于其他查找類型,如范圍查找,是不能使用的。因此,這里出現(xiàn)了non-hash searches/s的情況。用hash searches : non-hash searches命令可以大概了解使用哈希索引后的效率。
由于自適應(yīng)哈希索引是由InnoDB存儲(chǔ)引擎控制的,所以這里的信息只供我們參考。不過(guò)我們可以通過(guò)參數(shù)innodb_adaptive_hash_index來(lái)禁用或啟動(dòng)此特性,默認(rèn)為開(kāi)啟。
轉(zhuǎn)自http://www.cnblogs.com/ylqmf/archive/2011/09/16/2179166.html