校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 一次Mysql使用IN大數據量的優化記錄

一次Mysql使用IN大數據量的優化記錄

熱門標簽:石家莊400電話辦理公司 宜賓全自動外呼系統廠家 地圖標注客戶付款 新鄉智能外呼系統好處 申請400電話電話價格 臨沂做地圖標注 許昌外呼增值業務線路 咸陽防封電銷卡 廣東400企業電話申請流程

mysql版本號是5.7.28,表A有390W條記錄,使用InnoDB引擎,其中varchar類型字段mac已建立索引,索引方法為B-tree。B表僅有5000+條記錄。

有一條SQL指令是這樣寫的:

SELECT * FROM A WHERE mac IN("aa:aa:aa:aa:aa:aa","bb:bb:bb:bb:bb:b",...此外省略900+條)

通過查詢出來的結果耗時294.428s。沒錯,將近5分鐘。

使用EXPLAIN分析下:

訪問類型type是range,且已命中索引,rows行也只有587776,可為什么查詢耗時要這么久?

mac的索引方法使用了B-tree,那對比下它與HASH的區別,簡單地總結下:B-tree索引可以用于進行 =,>,>=,,=和between的計算,而HASH只能進行等值運算,不能進行范圍查找。那IN是等值運算,兩種索引方法都適用。即然這樣,把mac的索引方法修改為HASH,同樣的查詢耗時為。

既然調整索引方法并不能明顯地提升語句的查詢性能,那只能從語句本身中進行處理。其實明眼人剛開始一看就知道,SELECT * 是很耗性能的,那我們只查業務上需要的字段,語句調整為:

SELECT id,mileage FROM A WHERE mac IN("aa:aa:aa:aa:aa:aa","bb:bb:bb:bb:bb:b",...此外省略900+條)

耗時并沒有明顯的提升。

竟然IN的方式這么難優化,是不是可以放棄使用LEFT JOIN呢?語句調整為:

SELECT a.id,a.mileage FROM A a LEFT JOIN B b ON b.mac = a.mac WHERE b.create_time >= '2020-01-01'

耗時超過5分鐘,放棄。

我們知道,在條件量少的情況,EXISTS和IN的效果沒有顯示的差別。但條件多的時候,IN要比EXISTS的效率也高,來試下EXISTS:

SELECT id,mileage FROM A a WHERE EXISTS(SELECT mac FROM B WHERE create_time >= '2020-01-01' AND mac = a.mac)

耗時也是超過5分鐘,IN的效率確實要比EXISTS高,放棄。

所以最后的結論是,如果IN后接大數據量的String,要慎重。

在項目中我把mac作為唯一標識建立與id的對應表,在A表使用mac_id代替mac,查詢的時候使用IN(1,2,3...)。效率會提高一些。當前使用NoSQL也是一種方式。

總結

到此這篇關于一次Mysql使用IN大數據量優化的文章就介紹到這了,更多相關Mysql使用IN大數據量優化內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MYSQL IN 與 EXISTS 的優化示例介紹
  • MySQL中對于not in和minus使用的優化
  • MySql如何使用not in實現優化
  • MySQL中or、in、union與索引優化詳析
  • MySQL之select in 子查詢優化的實現

標簽:日照 鎮江 鷹潭 臺灣 北京 貴州 合肥 阜新

巨人網絡通訊聲明:本文標題《一次Mysql使用IN大數據量的優化記錄》,本文關鍵詞  一次,Mysql,使用,大,數據,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《一次Mysql使用IN大數據量的優化記錄》相關的同類信息!
  • 本頁收集關于一次Mysql使用IN大數據量的優化記錄的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 仁化县| 凤山县| 秭归县| 宜君县| 鹿邑县| 阿拉善右旗| 昔阳县| 鱼台县| 桂阳县| 邳州市| 云和县| 镇江市| 漯河市| 高青县| 丰顺县| 乌鲁木齐县| 平湖市| 潮州市| 凤阳县| 连江县| 阳朔县| 和田市| 澄江县| 吕梁市| 茶陵县| 江津市| 东宁县| 铜梁县| 二连浩特市| 苏尼特左旗| 沙坪坝区| 襄樊市| 江都市| 石台县| 那坡县| 福建省| 彭水| 藁城市| 兴义市| 利津县| 怀柔区|