轉載自:https://blog.csdn.net/josjiang1/article/details/80637076
作者:josjiang1
————————總結————————
使用場景:
1,當表中一個字段過長時,建立索引就不適合的了,建立索引的一個原則就是索引不能太寬。
2,對於varchar(max)、nvarchar(max) 和 varbinary(max) 大值數據類型根本就不能建立索引。
--(@URL nvarchar(500) 無法創建索引)-- SELECT * FROM tablename WHERE URL = @URL
定義:
返回按照表的某一行或一組表達式計算出來的校驗和值。CHECKSUM 用於生成哈希索引。使用 CHECKSUM 生成哈希索引,通過將校驗和列添加到索引的表中,然后對校驗和列生成索引來生成哈希索引,尤其是當要索引的列為較長的字符列時可以提高索引速度。
步驟:
1- 為表的URL列添加校驗和,並將其作為一列 (csURL) 加入該表:
alter table tablename add csURL as CHECKSUM(URL)
2- 為校驗和列添加索引:
CREATE INDEX URL_index ON tablename (csURL);
3- 使用索引進行查詢:
SELECT * FROM tablename WHERE csURL =CHECKSUM(@URL)
不支持類型:
CHECKSUM函數無法應用於如下非可比數據類型: text、ntext、image 和 cursor。
————————詳細介紹————————
哈希索引(hash index)基於哈希表實現,只有精確匹配索引所有列的查詢才有效。對於每一行數據,存儲引擎都會對所有的索引列計算一個哈希碼(hash code),哈希碼是一個較小的值,並且不同鍵值的行計算出來的哈希碼也不一樣。哈希索引將所有的哈希碼存儲在索引中,同時在哈希表中保存指向每個數據行的指針。
對於hash相同的,采用鏈表的方式解決沖突。類似於hashmap。因為索引的結構是十分緊湊的,所以hash索引的查詢很快。
舉例:

hash索引的限制:
哈希索引只包含哈希值和行指針,而不存儲字段值,所以不能使用索引中的值來避免讀取行。
哈希索引數據並不是按照索引值順序存儲的,所以也就無法用於排序。
哈希索引也不支持部分索引列匹配查找,因為哈希索引始終是使用索引列的全部內容來計算哈希值的。
哈希索引只支持等值比較查詢,包括=、IN()、<>(注意<>和<=>是不同的操作)。也不支持任何范圍查詢,例如WHERE price>100。
訪問哈希索引的數據非常快,除非有很多哈希沖突(不同的索引列值卻有相同的哈希值)。當出現哈希沖突的時候,存儲引擎必須遍歷鏈表中所有的行指針,逐行進行比較,直到找到所有符合條件的行。
如果哈希沖突很多的話,一些索引維護操作的代價也會很高。例如,如果在某個選擇性很低(哈希沖突很多)的列上建立哈希索引,那么當從表中刪除一行時,存儲引擎需要遍歷對應哈希值的鏈表中的每一行,找到並刪除對應行的引用,沖突越多,代價越大。
---------------------
作者:簡之
來源:CSDN
原文:https://blog.csdn.net/olizxq/article/details/82313489
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
