哈希索引


只有Memory引擎支持哈希索引(不討論NDB集群支持唯一哈希索引的情況)
哈希索引基於哈希表實現,只有精確匹配索引所有列的查詢才有效。
存儲引擎會根據所有的索引計算出一個哈希碼
哈希索引將所有的哈希碼存儲在索引中,同時在哈希表中保存指向每個數據行額指針。
因為索引只是只需要存儲對應的哈希值,所以索引的結構十分緊湊,使得哈希表查詢非常快。
 
哈希表有一下限制:
哈希索引只包含哈希值和行指針,而不存儲字段值,所以不能使用索引中值來避免行讀取
哈希索引不是按照索引順序存儲的,因此也無法用於排序
哈希索引不支持部分索引匹配,因為哈希索引是根據全部索引列計算的哈希碼
哈希索引只支持等值比較查詢,=、in、<=>,不支持范圍查詢例如where a>100
訪問哈希索引非常快,除非是哈希沖突,當出現哈希沖突時,存儲引擎必須遍歷鏈表中所有的行指針,逐行比較,直到找到符合條件的行
 
驗證“哈希索引基於哈希表實現,只有精確匹配索引所有列的查詢才有效”
舉例:
CREATE TABLE `white_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`teacherEmail` varchar(30) DEFAULT NULL,
`whiteFlag` int(1) DEFAULT '0',
`creationTime` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `PK_INDEX` (`teacherEmail`,`whiteFlag`) USING HASH
) ENGINE=MEMORY AUTO_INCREMENT=64 DEFAULT CHARSET=utf8;
 
針對以下四種情況:只有前兩種可以使用到hash索引
第一種:EXPLAIN select id,t.teacherEmail from white_user t where whiteflag=1 and teacheremail='testdemo2';
第二種:EXPLAIN select id,t.teacherEmail from white_user t where teacheremail='testdemo2' and whiteflag=1 ;
第三種:EXPLAIN select id,t.teacherEmail from white_user t where teacheremail='testdemo2';
第四種:EXPLAIN select id,t.teacherEmail from white_user t where whiteflag=1 ;
 
Innodb引擎對哈希索引的使用
Innodb引擎有一個特殊的功能叫做“自適應哈希索引”,當Innodb注意到某些索引值被使用的非常頻繁時,它會在內存中給予b-tree索引之上再創建一個哈希索引,這樣就讓b-tree索引頁具有哈希索引的一些優點,比如快速哈希查找,這種完全自動的、內部的行文。
Innodb引擎可以模擬哈希索引,在表上創建一個偽哈希索引,也可以享受哈希索引 帶來的便利,例如可以存儲很小的索引就可以為超長的字段創建索引。
建議使用CRC32哈希函數,不建議使用SHA1和MD5哈希函數,因為后兩個函數得出的哈希碼非常長,會浪費大量空間,做比較時也慢。但是SHA1和MD5哈希函數進行的是強加密函數,設計目標是最大限度的消除沖突。
如果表非常大的話,CRC32哈希函數會出現大量哈希沖突,可以考慮自己實現一個64位的哈希函數。
 
舉例:
CREATE TABLE `white_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`teacherEmail` varchar(30) DEFAULT NULL,
`whiteFlag` int(1) DEFAULT '0',
`hashCode` varchar(255) DEFAULT NULL,
`creationTime` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `PK_INDEX` (`teacherEmail`,`whiteFlag`) USING BTREE),
KEY `PK_HASHCODE` (`hashcode`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=64 DEFAULT CHARSET=utf8;
 
新增數據時,hashcode字段中應該存儲CRC32(teacheremail)獲得的哈希碼
 
執行下面條件時,可以使用到
EXPLAIN select id,t.teacherEmail from white_user t where hashcode=CRC32('testdemo2') AND whiteflag=1 and teacheremail='testdemo2';
這樣就可以利用哈希索引加快查詢速度,同時對超大字段盡心索引。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM