MySQL面試題講解之如何設定Hash索引

2022-09-21 01:00:10 字數 2262 閱讀 8918

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

只有memory引擎支援,場景簡單

myisam的乙個特殊索引型別,主要用於地理空間資料型別

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。

比如我們想查id_card_n4對應username:

四個id_card_n值並不一定遞增,這樣即使增加新的user,速度也快,只需在後追加。 當然缺點也很明顯,不是有序,所以hash索引做區間查詢速度很慢。比如要找身份證號在[id_card_x, id_card_y]區間的所有使用者,就須全表掃瞄。

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

可通過增加乙個字段,儲存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(「[email protected]」)

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

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

| email                    |&程式設計客棧nbsp; email_hash  |

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

| [email protected] | 2765311122 |

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

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

mysql 不用怕面試題 MySQL 面試題

資料庫事務的四個特性及含義原子性 atomicity 一致性 correspondence 隔離性 isolation 永續性 durability 原子性 整個事務中的所有操作,要麼全部完成,要麼全部不完成。事務在執行過程中發生錯誤,會被回滾 rollback 到事務開始前的狀態,就像這個事務從來...

經典面試題講解筆記

原因 併發爭搶修改導致,乙個人正在寫入,另乙個同學過來搶,導致資料修改不一致,出現異常 方案 1.new vector 2.collections.synchronizedlist new arraylist 2.juc包中的new copyonwritearraylist 4.hashset的底層...

C 面試題之i 面試題

i 面試題1.cpp 中國台灣某著名防毒軟體公司2005年10月面試題 int i 3,j 4 i?i j printf d d n i,j a.3 3 b.4 4 c.3 4 d.4 3 答案b i 面試題2.cpp 中國某著名計算機金融軟公司2005年面試題 int x 1,j 2 int k ...