阿里面試官 設計個MySQL的Hash索引吧

2021-10-14 06:03:25 字數 2724 閱讀 2878

除了b-tree 索引,mysql還提供了如下索引:

索引 / 儲存引擎

myisam

innodb

memory

b-tree索引

支援支援

支援hash索引

不支援不支援支援

r-tree索引

支援支援

不支援

full-text索引

支援支援

不支援

最常用的索引也就是b-tree索引和hash索引,且只有memoryndb兩種引擎支援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。

比如我們想查id_card_n4對應username:

id_card_n4通過hash函式算出a

按順序遍歷,找到user4

四個id_card_n值並不一定遞增,這樣即使增加新的user,速度也快,只需在後追加。

當然缺點也很明顯,不是有序,所以hash索引做區間查詢速度很慢。比如要找身份證號在[id_card_x, id_card_y]區間的所有使用者,就須全表掃瞄。

要使innodb或myisam支援雜湊索引,可以通過偽雜湊索引來實現,叫自適應雜湊索引。

可通過增加乙個字段,儲存hash值,將hash值建立索引,在插入和更新的時候,建立觸發器,自動新增計算後的hash到表裡。

雜湊表這種結構適用於只有等值查詢的場景,比如memcached。

假如有乙個非常非常大的表,比如使用者登入時需要通過email檢索出使用者,如果直接在email列建索引,除了索引區間匹配,還要進行字串匹配比對,email短還好,如果長的話這個查詢代價就比較大。

若此時,在email建立雜湊索引,查詢以int查詢,效能就比字串比對查詢快多了。

建立雜湊索引,首先就要選定雜湊演算法,《高效能mysql》說到的crc32演算法。

在表中新增hash值的字段:

alter

table

`user

`add

column email_hash int

unsigned

notnull

default

0;

接下來就是在update和insert時,自動更新email_hash字段,通過觸發器實現:

delimiter

|create

trigger user_hash_insert before inserton`

user

`for each row

begin

set new.email_hash=crc32(new.email)

;end;|

create

trigger user_hash_update before updateon`

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

(「[email protected]」)

and `email`= 「[email protected]」;

+----------------------------+------------+

| email | email_hash |

+----------------------------+------------+

| [email protected] | 2765311122 |

+----------------------------+------------+

and email = "[email protected]"是為了防止雜湊碰撞時資料不準確。

阿里面試官 corn表示式

我們資料庫平時寫sql語句都寫多了,今天我們要學的是cron表示式也就是定時任務,網上都有一些生成的方法,但是我這裡要自己寫不想經常依賴網上的生成器。cron的組成結構是秒 分 時 日 月 周 年 欄位名 允許的值 允許的特殊字元 秒 0 59 分 0 59 小時 0 23 日 1 31 l w c...

面試官常問的設計模式

設計模式分為三大類 建立型模式,共五種 工廠方法模式 抽象工廠模式 單例模式 建造者模式 原型模式。結構型模式,共七種 介面卡模式 裝飾器模式 模式 外觀模式 橋接模式 組合模式 享元模式。行為型模式,共十一種 策略模式 模板方法模式 觀察者模式 迭代子模式 責任鏈模式 命令模式 備忘錄模式 狀態模...

面試官最愛提的15個問題

面試官最愛提的15個問題 招聘會上往往乙個細微的動作就會決定乾坤。就業指導服務中心專家昨日提醒提防面試中的非語言陷阱。握手 這是你與面試官的初次見面。如果他 她 向你伸出手,卻握到乙隻軟弱無力 溼乎乎的手,那麼這不是乙個好的開端。你握起 手來應該堅實有力,但不要太使勁,你的手應當是幹暖的。你的姿勢 ...