高效能 索引型別 雜湊索引以及其他索引

2021-10-12 02:43:39 字數 3123 閱讀 3348

⏰ 雜湊索引介紹

雜湊索引( 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會對字段型別進...