標籤:

MySQL的Hash索引

提起MySQL索引,會習慣性想起B+Tree,其實MySQL常用的索引有兩種:

  • B+Tree索引
  • Hash索引(只有Memory存儲引擎支持)

從名字上可以看到,這兩種索引使用的是兩種不同的數據結構,前者是B+Tree,後者是Hash。

Hash索引使用Hash演算法(比如CRC32)把鍵值轉換成一個hashcode,存放在索引中。在檢索時,不必想B+樹那樣從根到葉子逐級查找,而是一次定位。對於每一行數據,存儲引擎都會對所有索引計算一個哈希碼,哈希碼是一個較小的值並且不同鍵值計算出來的哈希碼都不一樣。哈希索引將所有的哈希碼存儲在索引中,同時在哈希表中保存指向每個數據的指針。

Hash索引的優缺點都很明顯:

  1. Hash 索引僅僅能滿足"=","IN"和"<=>"查詢,不能使用範圍查詢。
  2. hash索引無法通過操作索引來排序,因為存放的時候經過hash計算,但是計算的hash值和存放的不一定相等,所以無法排序
  3. 哈希索引也沒辦法利用索引完成排序,以及like 『xxx%』 這樣的部分模糊查詢(這種部分模糊查詢,其實本質上也是範圍查詢)
  4. 不能避免表掃描。Hash 索引是將索引鍵通過 Hash 運算之後,將 Hash運算結果的 Hash 值和所對應的行指針信息存放於一個 Hash 表中,由於不同索引鍵存在相同 Hash 值,所以即使取滿足某個 Hash 鍵值的數據的記錄條數,也無法從 Hash 索引中直接完成查詢,還是要通過訪問表中的實際數據進行相應的比較,並得到相應的結果。
  5. Hash碰撞問題會使索引效率降低

參考:MySQL索引之哈希索引,MySQL的btree索引和hash索引的區別 - 14的路 - 博客園

http://imysql.com/2016/01/06/mysql-faq-different-between-btree-and-hash-index.shtml?

imysql.com


推薦閱讀:

簡單說明下MySQL的內存使用
MySQL訓練——Using NULL@sqlzoo.net
使用Python的Scrapy框架爬取51job職位
MySQL · 性能優化 · MySQL常見SQL錯誤用法
MyCLI :一個支持自動補全和語法高亮的 MySQL/MariaDB 客戶端

TAG:MySQL |