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