一、概念:CRC全稱為Cyclic Redundancy Check,又叫循環冗余校驗。CRC32是CRC算法的一種,常用於校驗網絡上傳輸的文件。
二:MySQL里如何利用CRC32來加快查詢???
CRC32的基本特征:
#1.CRC32函數返回值的范圍是0-4294967296(2的32次方減1)
#2.相比MD5,CRC32函數很容易碰撞
CRC32的使用場景:
由上述兩個基本特性可知,MySQL CRC32 生成整型結果使用用bigint存儲,而MD5需要varchar來存儲。但是CRC32很容易碰撞,這適合做索引么?
場景:我們在做一個爬蟲,對於一個URL,先去數據庫里查詢是否存在,如果不存在,插入到數據庫中。大家都知道這種類型應用表會增長非常迅速,如果簡單的
SELECT * FROM urls WHERE url = 'http://wwww.shopperplus.com';
會每次全表掃描,效率非常低。如果在url列上面加索引會快一些,但由於url是varchar類型,字段本身的存儲空間和索引占用的存儲空間都比較大。
SELECT * FROM urls WHERE crc_url = 907060870 AND url = 'hello';
這樣一來,大部分查詢還是只需要掃描一行就獲得結果。對於少部分碰撞的記錄,只需要多掃描幾行也可以正確獲得結果。 url的場景從varchar到bigint的優化其實效果不是特別明顯。另一個例子是文本,假如我們有一個text類型的字段(文章內容、評論、微博之類),每次插入之前要判斷一下這個內容是否在數據庫里存在了。如果使用crc32的技巧,改善的空間還是蠻大的。
三、crc32 缺點容易發生碰撞,有沒有更好的方案? 答案是肯定的 -> crc64
crc64() 這個函數補充了MySQL的crc32()函數,其結果是在大量值上分布不均勻。crc64()算法依賴於MD5作為底層機制。