日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql 索引的基础(下)

發布時間:2024/9/5 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql 索引的基础(下) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  如果需要存儲大量的URL并需要根據URL進行搜索查找。如果使用B-Tree 來存儲URL,存儲的內容就會很大,因為URL本身都很長。正常情況下會有如下查詢:

SELECT id FROM url WHERE url="http://www.baidu.com";

  若刪除原來URL上的索引,而新增一個被索引的url_crc列,使用CRC32做hash ,就可以用下面的方式查詢:

SELECT id FROM url WHERE url='http://www.baidu.com' AND rul_crc=CRC32('http://www.baidu.com');

  這樣做性能非常高,因為MySQL 優化器會使用這個選擇性很高而體積很小的基于url_crc列的索引來完成查找。即使有多個相同的索引值,查找任然很快,只需要根據hash值做快速的整數比較就能找到索引條目,然后一一返回對應的行。另外一種方式就是對完整的URL字符串做索引,那樣會非常慢。

  這樣實現的缺陷是需要維護hash值。可以手動維護,可以觸發器實現。如果采用這種方式,記住,不要使用SHA1()和MD5()作為哈希函數。因為這兩個函數計算出來的hash值時非常長的字符串,會浪費更大的空間,比較時也會更慢。SHA1()和MD5()是強加密函數,設計目標是最大限度的消除沖突,蛋這里并不需要這樣搞的要求。簡單hash函數的沖突在一個可以接受的范圍,同事有能提供更好的性能。

  如果數據表非常大,CRC32()會出現大量的hash沖突,則可以考慮自己實現一個簡單的64位hash函數。這個自定義的函數要返回整數,而不是字符串。一個簡單的辦法可以使用MD5()函數返回值的一部分來作為自定義hash函數。這肯能比自己寫一個hash算法的性能要差,不過這樣實現最簡單。

  SELECT CONV(RIGHT(MD5('http://www.baidu.com'),16),16,10) AS HASH64.

  處理hash沖突。當使用hash索引進行查詢的時候,必須在WHERE子句中包含常量值:

  SELECT id from url WHERE url=crc32('http://www.baidu.com') AND url='http://www.baidu.com';

  一旦出現hash沖突,另一個字符串的hash值也恰好是相同的,則下面的語句是無法正確工作的:

  SELECT id from url WHERE url=crc32('http://www.baidu.com');

  因為所謂的‘生日悖論’ 出現hash沖突的概率的增長率可能比想象的要快的多,CRC32()返回的是32位整數,當索引有9.3W條記錄時,出現沖突的概率是1%。例如,我們將'/usr/share/dic/words' 中的詞倒數數據表,并進行crc32()計算,最后會有98569行。這就已經出現一次hash沖突了。要避免hash沖突問題,必須在WHERE 條件中帶入hahs值和對應的列值。如果不是想查詢具體的值,例如只是統計記錄數(不精確的),則可以不帶入列值,直接使用crc32()的hash值查詢即可。還可以使用FNV64()函數作為hash函數,hash值為64位,速度非常快,且沖突比crc32()要少很多。

  

?

?

?

  

?

?

?

    

轉載于:https://www.cnblogs.com/zhengyanqiu/p/4979195.html

總結

以上是生活随笔為你收集整理的Mysql 索引的基础(下)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。