《MYSQL教程mysql索引教程之哈希索引》要點(diǎn):
本文介紹了MYSQL教程mysql索引教程之哈希索引,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
MYSQL必讀本節(jié)內(nèi)容:
mysql索引之哈希索引
MYSQL必讀哈希索引(Hash Index)建立在哈希表的基礎(chǔ)上,它只對(duì)使用了索引中的每一列的精確查找有用.
對(duì)于每一行,存儲(chǔ)引擎計(jì)算出了被索引的哈希碼(Hash Code),它是一個(gè)較小的值,并且有可能和其他行的哈希碼不同.
它把哈希碼保存在索引中,并且保存了一個(gè)指向哈希表中的每一行的指針.
MYSQL必讀在mysql中,只有memory存儲(chǔ)引擎支持顯式的哈希索引.如果多個(gè)值有相同的哈希碼,索引就會(huì)把行指針以鏈表的方式保存在哈希表的同一條記錄中.
MYSQL必讀哈希索引的細(xì)節(jié)還有很多,由于myISAM和innodb并不支持,所以在這里不詳解.
MYSQL必讀下面著力講解建立自己的哈希索引
MYSQL必讀想法非常簡(jiǎn)單,在標(biāo)準(zhǔn)的B-Tree索引上創(chuàng)建一個(gè)偽哈希索引.它和真正的哈希索引不是一回事,因?yàn)樗€是使用B-Tree索引進(jìn)行查找.然而,它將會(huì)使用鍵的哈希值進(jìn)行查找,而不是鍵自身.你所要做的事情就是在where子句中手動(dòng)地定義哈希函數(shù).
MYSQL必讀例子:URL查找.
URL通常會(huì)導(dǎo)致B-Tree索引變大,因?yàn)樗鼈兎浅iL(zhǎng).通常會(huì)按照下面的方式來(lái)查找URL表.
?
MYSQL必讀但是,如果移除掉url列上的索引并且給表添加一個(gè)被索引的url_src列,就可以按照下面的方式進(jìn)行查詢:
?
MYSQL必讀mysql查詢優(yōu)化器注意到url_src列上有很小的,選擇性很高的索引,并且它會(huì)使用里面的值進(jìn)行索引查找.即使有幾列相同的url_src值,也很容易進(jìn)行精確的對(duì)比來(lái)確定需要的行.替代方案是把完整的URL索引為字符串,它要慢很多.
MYSQL必讀這個(gè)辦法的一個(gè)缺點(diǎn)就是要維護(hù)哈希值.
可以手工進(jìn)行維護(hù),在mysql5.0 以上版本中,可以使用觸發(fā)器來(lái)進(jìn)行維護(hù).
1,創(chuàng)建一個(gè)表:
?
MYSQL必讀接下來(lái)創(chuàng)建觸發(fā)器.我們先暫時(shí)更新一下命令分隔符,這樣就可以在觸發(fā)器中使用分號(hào):
?
MYSQL必讀剩下的工作就是驗(yàn)證觸發(fā)器自動(dòng)維護(hù)了哈希值.
如果使用這種方式,就不應(yīng)該使用SHA1()和MD5()這此哈希函數(shù).它們返回很長(zhǎng)的字符串,會(huì)浪費(fèi)大量的存儲(chǔ)空間并且減慢比較速度.它們是強(qiáng)加密函數(shù),被設(shè)計(jì)為不產(chǎn)生任務(wù)沖突.這并不是我們的目標(biāo).簡(jiǎn)單的哈希函數(shù)能在有較好性能的同時(shí)保證可接受的沖突率.當(dāng)然,如果表有很多行并且CRC32()產(chǎn)生了很多沖突,就要實(shí)現(xiàn)自己的64位哈希函數(shù),要確保自己的函數(shù)返回整數(shù),而不是字符串.
?
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/6206.html