MySQL的雜湊索引和原理研究測試
1.雜湊索引 :(hash index)基於雜湊表實現,只有精確匹配到索引列的查詢,才會起到效果。對於每一行資料,儲存引擎都會對所有的索引列計算出一個雜湊碼(hash code),雜湊碼是一個較小的整數值,並且不同索引值的行計算出來的雜湊碼也不一樣。
2.只有Memory儲存引擎顯式支援雜湊索引,但是原理可以用在偽雜湊索引上
表結構如下:
create table test_hash(
fname varchar(100) not null default '',
lname varchar(100) not null default '',
index using hash(fname)
) engine=memory
insert into test_hash values ('zhang','san'),('tao','shihan'),('li','si');
3.假設會有這樣一個雜湊函數f(),該返回下面的雜湊碼整數值
f('tao')=2323
f('zhang')=7437
f('li')=8784
4.一張雜湊表,儲存著對應關係,槽編號是循序的,值資料行不是
槽(Slot) 值(Value)
2323 指向第2行資料
7437 指向第1行資料
8784 指向第3行資料
5.select lname from test_hash where fname='tao'\G;
mysql先計算'tao'的雜湊值,f('tao')=2323,然後根據該值在雜湊索引表中尋找對應的行,找到它指向的是
第2行資料,直接查詢第2行資料,判斷fname是tao,確保正確
6.雜湊衝突:不同的值得到了相同的雜湊碼,例如f('tao')=2323 f('wang')=2323,此時就是出現了雜湊衝突
當出現雜湊衝突時,相同的資料會儲存在鏈表中,遍曆鏈表找到符合的。
7.特點:
1)雜湊索引只包含雜湊碼和指標,不儲存資料欄位值
2)雜湊索引資料並不是按循序儲存的,因此無法用於排序
3)因為要通過查詢值計算確定的雜湊碼,所以雜湊索引不支援部分匹配,不支援範圍尋找,只支援等值比較查詢
4)當雜湊衝突很多的時候,效率會降低
在InnoDB儲存引擎上,可以基於上面的原理,實現偽雜湊索引,配合預設的B-Tree索引
本文永久更新連結地址:https://www.bkjia.com/Linux/2018-03/151364.htm