您好,登錄后才能下訂單哦!
這篇文章主要講解了“MySQL中怎么設置Hash索引”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“MySQL中怎么設置Hash索引”吧!
除了B-Tree 索引,MySQL還提供了如下索引:
Hash索引
只有Memory引擎支持,場景簡單
R-Tree索引
MyISAM的一個特殊索引類型,主要用于地理空間數據類型
Full-text
MyISAM的一個特殊索引,主要用于全文索引,從MySQL 5.6開始InnoDB支持全文索引
索引 / 存儲引擎MyISAMInnoDBMemoryB-Tree索引支持支持支持HASH索引不支持不支持支持R-Tree索引支持支持不支持Full-text索引支持支持不支持
最常用的索引也就是B-tree索引和Hash索引,且只有Memory, NDB兩種引擎支持Hash索引。 Hash索引適于key-value查詢,通過Hash索引比B-tree索引查詢更加迅速。但Hash索引不支持范圍查找例如<><==,>==等。 Memory只有在"="的條件下才會使用hash索引
MySQL在 8.0才支持函數索引,在此之前只能對列的前面某一部分進行索引,例如標題title字段,可以只取title的前10個字符索引,這樣的特性大大縮小了索引文件的大小,但前綴索引也有缺點,在order by和group by操作時失效。
create index idx_title on film(title(10));
只存在數組,用一個hash函數把key轉換成一個確定的內存位置,然后把value放在數組的該位置。使用 hash 自然會有哈希沖突可能,MySQL 采取拉鏈法解決。
Hash索引基于Hash表實現,只有查詢條件精確匹配Hash索引中的列時,才能夠使用到hash索引。對于Hash索引中的所有列,存儲引擎會為每行計算一個hashcode,Hash索引中存儲的就是hashcode。
例如一個維護了身份證號和姓名的表,根據身份證號查找對應名字,其hash索引如下:
比如我們想查ID_card_n4對應username:
將ID_card_n4通過hash函數算出A
按順序遍歷,找到User4
四個ID_card_n值并不一定遞增,這樣即使增加新的User,速度也快,只需在后追加。 當然缺點也很明顯,不是有序,所以hash索引做區間查詢速度很慢。比如要找身份證號在[ID_card_X, ID_card_Y]區間的所有用戶,就須全表掃描。
必須二次查找
不支持部分索引查找、范圍查找
哈希碼可能存在哈希沖突,如果hash 算法設計不好,碰撞過多,性能也會變差
索引存放的是hash值,所以僅支持 < = > 以及 IN
無法通過操作索引來排序,因為存放的時候會經過hash計算,但是計算的hash值和存放的不一定相等,所以無法排序
不能避免全表掃描,只是由于在memory表里支持非唯一值hash索引,即不同的索引鍵,可能存在相同hash值
因為哈希表是一種根據關鍵字直接訪問內存存儲位置的數據結構 ,所以利用其原理的hash 索引,也就需要將所有數據文件添加到內存,這就很耗內存
如果所有的查詢都是等值查詢,那么hash確實快,但實際上范圍查找數據更多
智能處理鍵值得全值匹配
查詢Hash函數決定著索引鍵的大小
要使InnoDB或MyISAM支持哈希索引,可以通過偽哈希索引來實現,叫自適應哈希索引。
可通過增加一個字段,存儲hash值,將hash值建立索引,在插入和更新的時候,建立觸發器,自動添加計算后的hash到表里。
哈希表這種結構適用于只有等值查詢的場景,比如Memcached。
假如有一個非常非常大的表,比如用戶登錄時需要通過email檢索出用戶,如果直接在email列建索引,除了索引區間匹配,還要進行字符串匹配比對,email短還好,如果長的話這個查詢代價就比較大。 若此時,在email建立哈希索引,查詢以int查詢,性能就比字符串比對查詢快多了。
建立哈希索引,首先就要選定哈希算法,《高性能MySQL》說到的CRC32算法。
在表中添加hash值的字段:
ALTER TABLE `User` ADD COLUMN email_hash int unsigned NOT NULL DEFAULT 0;
接下來就是在UPDATE和INSERT時,自動更新 email_hash 字段,通過觸發器實現:
DELIMITER | CREATE TRIGGER user_hash_insert BEFORE INSERT ON `User` FOR EACH ROW BEGIN SET NEW.email_hash=crc32(NEW.email); END; | CREATE TRIGGER user_hash_update BEFORE UPDATE ON `User` FOR EACH ROW BEGIN SET NEW.email_hash=crc32(NEW.email); END; | DELIMITER ;
這樣SELECT請求就會變成:
SELECT `email`, `email_hash` FROM `User` WHERE email_hash = CRC32(“xxoo@gmail.com”) AND `email`= “xxoo@gmail.com”;
+----------------------------+------------+
| email | email_hash |
+----------------------------+------------+
| xxoo@gmail.com | 2765311122 |
+----------------------------+------------+
AND email = "xxoo@gmail.com" 是為了防止哈希碰撞時數據不準確。
感謝各位的閱讀,以上就是“MySQL中怎么設置Hash索引”的內容了,經過本文的學習后,相信大家對MySQL中怎么設置Hash索引這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。