除了b-tree 索引,mysql還提供了如下索引:
索引 / 儲存引擎
myisam
innodb
memory
b-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。
比如我們想查id_card_n4
對應username:
將id_card_n4
通過hash函式算出a
按順序遍歷,找到user4
四個id_card_n
值並不一定遞增,這樣即使增加新的user,速度也快,只需在後追加。
當然缺點也很明顯,不是有序,所以hash索引做區間查詢速度很慢。比如要找身份證號在[id_card_x, id_card_y]區間的所有使用者,就須全表掃瞄。
要使innodb或myisam支援雜湊索引,可以通過偽雜湊索引來實現,叫自適應雜湊索引。雜湊表這種結構適用於只有等值查詢的場景,比如memcached。可通過增加乙個字段,儲存hash值,將hash值建立索引,在插入和更新的時候,建立觸發器,自動新增計算後的hash到表裡。
假如有乙個非常非常大的表,比如使用者登入時需要通過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
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個問題 招聘會上往往乙個細微的動作就會決定乾坤。就業指導服務中心專家昨日提醒提防面試中的非語言陷阱。握手 這是你與面試官的初次見面。如果他 她 向你伸出手,卻握到乙隻軟弱無力 溼乎乎的手,那麼這不是乙個好的開端。你握起 手來應該堅實有力,但不要太使勁,你的手應當是幹暖的。你的姿勢 ...