人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

MySQL面試題講解之如何設(shè)置Hash索引

發(fā)布日期:2022-02-05 13:46 | 文章來源:腳本之家

除了B-Tree 索引,MySQL還提供了如下索引:

  • Hash索引

只有Memory引擎支持,場景簡單

  • R-Tree索引

MyISAM的一個特殊索引類型,主要用于地理空間數(shù)據(jù)類型

  • 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才支持函數(shù)索引,在此之前只能對列的前面某一部分進(jìn)行索引,例如標(biāo)題title字段,可以只取title的前10個字符索引,這樣的特性大大縮小了索引文件的大小,但前綴索引也有缺點,在order by和group by操作時失效。

create index idx_title on film(title(10));

1 特點

只存在數(shù)組,用一個hash函數(shù)把key轉(zhuǎn)換成一個確定的內(nèi)存位置,然后把value放在數(shù)組的該位置。使用 hash 自然會有哈希沖突可能,MySQL 采取拉鏈法解決。

Hash索引基于Hash表實現(xiàn),只有查詢條件精確匹配Hash索引中的列時,才能夠使用到hash索引。對于Hash索引中的所有列,存儲引擎會為每行計算一個hashcode,Hash索引中存儲的就是hashcode。

  • 例如一個維護(hù)了身份證號和姓名的表,根據(jù)身份證號查找對應(yīng)名字,其hash索引如下:

比如我們想查ID_card_n4對應(yīng)username:

  • 將ID_card_n4通過hash函數(shù)算出A
  • 按順序遍歷,找到User4

四個ID_card_n值并不一定遞增,這樣即使增加新的User,速度也快,只需在后追加。 當(dāng)然缺點也很明顯,不是有序,所以hash索引做區(qū)間查詢速度很慢。比如要找身份證號在[ID_card_X, ID_card_Y]區(qū)間的所有用戶,就須全表掃描。

2 Hash索引的缺陷

  • 必須二次查找
  • 不支持部分索引查找、范圍查找
  • 哈希碼可能存在哈希沖突,如果hash 算法設(shè)計不好,碰撞過多,性能也會變差
  • 索引存放的是hash值,所以僅支持 < = > 以及 IN
  • 無法通過操作索引來排序,因為存放的時候會經(jīng)過hash計算,但是計算的hash值和存放的不一定相等,所以無法排序
  • 不能避免全表掃描,只是由于在memory表里支持非唯一值hash索引,即不同的索引鍵,可能存在相同hash值
  • 因為哈希表是一種根據(jù)關(guān)鍵字直接訪問內(nèi)存存儲位置的數(shù)據(jù)結(jié)構(gòu) ,所以利用其原理的hash 索引,也就需要將所有數(shù)據(jù)文件添加到內(nèi)存,這就很耗內(nèi)存
  • 如果所有的查詢都是等值查詢,那么hash確實快,但實際上范圍查找數(shù)據(jù)更多
  • 智能處理鍵值得全值匹配
  • 查詢Hash函數(shù)決定著索引鍵的大小

要使InnoDB或MyISAM支持哈希索引,可以通過偽哈希索引來實現(xiàn),叫自適應(yīng)哈希索引。

可通過增加一個字段,存儲hash值,將hash值建立索引,在插入和更新的時候,建立觸發(fā)器,自動添加計算后的hash到表里。

哈希表這種結(jié)構(gòu)適用于只有等值查詢的場景,比如Memcached。

3 案例應(yīng)用

假如有一個非常非常大的表,比如用戶登錄時需要通過email檢索出用戶,如果直接在email列建索引,除了索引區(qū)間匹配,還要進(jìn)行字符串匹配比對,email短還好,如果長的話這個查詢代價就比較大。 若此時,在email建立哈希索引,查詢以int查詢,性能就比字符串比對查詢快多了。

Hash 算法

建立哈希索引,首先就要選定哈希算法,《高性能MySQL》說到的CRC32算法。

INSERT UPDATE SELECT 操作

在表中添加hash值的字段:

ALTER TABLE `User` ADD COLUMN email_hash int unsigned NOT NULL DEFAULT 0;

接下來就是在UPDATE和INSERT時,自動更新 email_hash 字段,通過觸發(fā)器實現(xiàn):

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" 是為了防止哈希碰撞時數(shù)據(jù)不準(zhǔn)確。

到此這篇關(guān)于MySQL面試題講解之如何設(shè)置Hash索引的文章就介紹到這了,更多相關(guān)MySQL 設(shè)置Hash索引內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!

海外服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部