MySql crc32&&crc64函數提高字符串查詢效率


一、概念: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作為底層機制。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM