mysql雜湊索引用途 MySQL 雜湊索引

2021-10-18 21:28:29 字數 1592 閱讀 4750

雜湊索引基於雜湊表實現,只有精確匹配索引所有列的查詢才有效。

在mysql中只有memory引擎顯示支援雜湊索引,也是memory引擎表的預設索引型別。memory引擎是支援非唯一雜湊索引的。如果多個列的雜湊值相同,索引會以鍊錶 的方式存放多個記錄指標道同乙個雜湊條目中。

舉個粒子:create table testhash(

fname varchar(50) not null,

lname varchar(50) not null,

key using hash(fname)

)engine=memory;

資料庫中的資料:

mysql> select * from testhash;

| fname | lname |

| baron | schwartz |

| arjen | lentz |

| peter | zaitsev |

| vadim | tkachenko |

4 rows in set (0.00 sec)

假設f() 為雜湊函式,f(fname) 的返回值是其雜湊值,對應槽位。槽位是按順序排列的。每個槽位上的值指向資料。

(結構可以理解為 jdk 1.7 中的hashmap的資料結構,乙個陣列和鍊錶的形式)

查詢的過程是是先計算'peter'的雜湊值,並使用改值尋找對應的記錄指標,也就是計算f('peter'),得到其雜湊值為 3468 ,然後在對應的槽位上找到記錄指標,找到對應行上的資料,最後一步是比較查詢的值是否為'peter' ,以確保就是要查詢的行。

雜湊索引的限制雜湊索引值包含雜湊值和行指標,而不儲存字段值,所以不能使用索引中的值來避免讀取行。

雜湊索引資料並不是按照索引值順序儲存的,所以無法用於排序

雜湊索引也不支援部分索引匹配查詢,因為雜湊索引始終是使用索引列的全部內容來計算雜湊值。例如,在資料列(a,b)上簡歷雜湊索引,如果查詢只有資料列a,則無法使用該索引。

雜湊索引只支援等值比較查詢,包括 =、in() 、<=>,也不支援任何範圍查詢,例如 where price > 100.

訪問雜湊索引的資料非常快,除非歐很多雜湊衝突。當出現雜湊衝突的時候,儲存引擎必須遍歷鍊錶中的行指標,裝進行比較,直到找到所有符合條件的行。

如果雜湊衝突很多的時候,一些索引維護操作的代價也會非常高。例如,如果在某個選擇性很低(雜湊衝突很多)的列上建立哈西索引,那麼當從表中刪除一行時,儲存引擎需要遍歷對應雜湊值的鍊錶中的每一行,找到並刪除對應行的引用,衝突越多,代價越大。

innodb引擎有乙個特殊的功能叫做"自適應雜湊索引。當innodb注意到某些索引值被引用得非常頻繁時,他會在記憶體中基於b-tree索引智商在建立乙個雜湊索引,這樣就讓b-tree索引也具有雜湊索引的一些優點。這是乙個完全自動 的、內部的行為,使用者無法控制或配置。不過如果有必要,完全可以關閉該功能。

mysql 雜湊索引 MySQL索引之雜湊索引

雜湊索引 hash index 建立在雜湊表的基礎上,它只對使用了索引中的每一列的精確查詢有用。對於每一行,儲存引擎計算出了被索引的雜湊碼 hash code 它是乙個較小的值,並且有可能和其他行的雜湊碼不同。它把雜湊碼儲存在索引中,並且儲存了乙個指向雜湊表中的每一行的指標。在mysql中,只有me...

mysql索引之雜湊索引

雜湊演算法時間複雜度為o 1 且不只存在於索引中,每個資料庫應用中都存在該資料結構。雜湊表也為雜湊表,又直接定址改進而來。在雜湊的方式下,乙個元素k處於h k 中,即利用雜湊函式h,根據關鍵字k計算出槽的位置。函式h將關鍵字域對映到雜湊表t 0.m 1 的槽位上。上圖中雜湊函式h有可能將兩個不同的關...

mysql索引之雜湊索引

雜湊演算法時間複雜度為o 1 且不只存在於索引中,每個資料庫應用中都存在該資料結構。雜湊表也為雜湊表,又直接定址改進而來。在雜湊的方式下,乙個元素k處於h k 中,即利用雜湊函式h,根據關鍵字k計算出槽的位置。函式h將關鍵字域對映到雜湊表t 0.m 1 的槽位上。上圖中雜湊函式h有可能將兩個不同的關...