⏰ 雜湊索引介紹
雜湊索引( hash index )
:基於雜湊表實現,只有精確匹配索引所有列的查詢才有效。對於每一行資料,儲存引擎都會對所有的索引列計算乙個雜湊碼( hash code )。雜湊碼是乙個較小的值,並且不同鍵值的行計算出來的雜湊碼也不一樣。
雜湊索引將所有的雜湊碼儲存在索引中,同時在雜湊表中儲存指向每個資料行的指標。
雜湊索引優點
:索引自身只需儲存對應的雜湊值,所以索引的結構十分緊湊,所以雜湊索引查詢的速度非常快。雖然雜湊索引只能適用於某些特定的場合。但是當查詢適合雜湊索引,則它帶來的效能提公升將非常顯著。
⏰ 引擎對雜湊索引的支援
memory引擎
:在mysql中,只有 memory引擎顯式支援雜湊索引。這也是 memory 引擎表的預設索引型別,memory 引擎同時也支援 b-tree 索引。
memory
:memory 引擎是支援非唯一雜湊索引的,這個特性在資料庫世界中是與眾不同的。如果多個列的雜湊值相同,索引會以鍊錶的方式存放多個記錄指標到同乙個雜湊條目中。
❗innodb引擎
:在innodb引擎中對雜湊索引的支援叫做 「自適應雜湊索引(adaptive hash index)?
」。當 innodb 注意到某些索引值被使用的非常頻繁時,它會在記憶體中基於 b-tree 索引之上再建立乙個雜湊索引,這樣就讓 b-tree 索引也具有雜湊索引的一些優點,比如快速的雜湊查詢。
這是乙個完全自動的,內部的行為,使用者無法控制或者配置,不過如果有必要,完全可以關閉該功能。⏰ 雜湊索引原理
表範例:假設我們有如下表和資料:
?
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 |
+-------+-----------+
| arjen | lentz |
| baron | schwartz |
| peter | zaitsev |
| vadim | tkachenko |
+-------+-----------+
假設索引使用假想的雜湊函式 f() ,它返回下面的值(都是示例資料,非真實資料):
?
f('arjen')=
2323
f('baron')=
7437
f('peter')=
8784
f('vadim')=
2458
則雜湊索引的資料結構如下:
?
+-------+-----------+
| 槽(slot)
| 值(
value)|
+-------+-----------+
|2323
| 指向第1行的指標 |
|2458
| 指向第4行的指標 |
|7437
| 指向第2行的指標 |
|8784
| 指向第3行的指標 |
+-------+-----------+
上述每個槽中的雜湊值都是有順序的,但是資料不是行。現在我們解析,如下查詢:
?
mysql>
select lname from testhash where fname=
'peter';+
---------+
| lname |
+---------+
| zaitsev |
+---------+
查詢過程
:mysql 先計算 peter 的雜湊值,並使用該值尋找對應的記錄指標。因為 f(『peter』)=8784,所以 mysql 在索引中查詢 8784,可以找到指向第3行的指標,最後一步是比較第三行的值是否為 peter ,以確保就是要查詢的行。
6. 索引自身只需儲存對應的雜湊值,所以索引的結構十分緊湊,所以雜湊索引查詢的速度非常快。
⏰ 雜湊索引限制
雜湊索引只包含雜湊值和行指標,而不儲存字段值,所以雜湊索引不能使用索引中的值來避免讀取行
。不過,訪問記憶體中行的速度很快,所以大部分情況這一點對效能的影響並不明顯。
雜湊索引資料並不是按照索引值排序儲存的,所以也就?無法用於排序
。
雜湊索引也?不支援部分索引列匹配查詢
,因為雜湊索引始終是使用索引列的全部內容來計算雜湊值的。例如,在資料列(a,b)上建立雜湊索引,如果查詢只有資料列a,則無法使用該索引。
雜湊索引只支援等值比較查詢,包括=
,in()
,<=>
。同樣的也不支援任何範圍查詢,例如 where price > 100。
訪問雜湊索引的資料非常快,除非有很多雜湊衝突(不同的索引列值卻有相同的雜湊值)。當出現雜湊衝突的時候,儲存引擎必須遍歷鍊錶中所有的行指標,逐行進行比較,直到找到所有符合條件的行。
如果雜湊衝突很多的話,一些索引維護操作的代價也會很高。例如,如果在某個選擇性很低(雜湊衝突很多)的列上建立雜湊索引,那麼當從表中刪除一行時,儲存引擎需要遍歷對應雜湊值的鍊錶中的每一行,找到並刪除對應行的引用,衝突越多,代價越大。
上述的限制,導致雜湊索引只適用於某些特定的場合。但是一旦適合雜湊索引,則它帶來的效能提公升將是非常顯著的。⏰ 空間資料索引(r-tree)
⏰ 全文索引
⏰ 其他索引
在表上建立索引以提高效能
1.索引是什麼 1.索引是什麼 1.索引是表示資料的一種方式,它提供的資料順序不同於資料在磁碟上的物理儲存順序。索引的特殊作用是在表內重新排列記錄的物理位置。索引基於表的一列或多列的組合建立。使用索引時,資料以一種分類排序的方式提供給使用者,排列順序可以用create index語句控制。通常,通過...
mysql建表 索引以及SQL效能優化
1前言2 設計部分 2.1設計表注意事項 2.1.1 定義字段型別 盡可能精確地定義字段型別,包括型別和長度 如不要以字元型別宣告純數字字段,業務上tinyint夠用的情況避免定義為int等。2.1.2 盡可能使用not null null需要更多的 更多的檢查和特殊的索引邏輯。所以大多數時候應該使...
es索引與資料結構 ,以及其他知識使用
1 es 索引與資料結構對映 es索引說明 索引結構 index type id 對應的關係型資料庫結構 index database type table id id 預設 插入新的索引 put test index default 1 查詢索引與資料結構 結果,test 解釋 es會對字段型別進...