<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      一、問題背景

      現(xiàn)網(wǎng)出現(xiàn)慢查詢,在500萬數(shù)量級(jí)的情況下,單表查詢速度在30多秒,需要對(duì)sql進(jìn)行優(yōu)化,sql如下:



      我在測(cè)試環(huán)境構(gòu)造了500萬條數(shù)據(jù),模擬了這個(gè)慢查詢。

      簡(jiǎn)單來說,就是查詢一定條件下,都有哪些用戶的。很簡(jiǎn)單的sql,可以看到,查詢耗時(shí)為37秒。


      說一下app_account字段的分布情況,隨機(jī)生成了5000個(gè)不同的隨機(jī)數(shù),然后分布到了這500萬條數(shù)據(jù)里,平均來說,每個(gè)app_account都會(huì)有1000個(gè)是重復(fù)的值,種類共有5000個(gè)。

      二、看執(zhí)行計(jì)劃



      可以看到,group by字段上我是加了索引的,也用到了。

      三、優(yōu)化

      說實(shí)話,我是不知道該怎么優(yōu)化的,這玩意還能怎么優(yōu)化?。∠日f下,下面的思路都是沒用的。

      思路一:

      后面應(yīng)該加上 order by null;避免無用排序,但其實(shí)對(duì)結(jié)果耗時(shí)影響不大,還是很慢。



      思路二:

      where條件太復(fù)雜,沒索引,導(dǎo)致查詢慢,但我給where條件的所有字段加上了組合索引,也還是沒用





      思路三:

      既然group by慢,換distinct試試??(這里就是本篇博客里說的神奇的地方了)



      臥槽????。?!這是什么情況,瞬間這么快了??!?。?br>
      雖然知道group by和distinct有很小的性能差距,但是真沒想到,差距居然這么大?。?!大發(fā)現(xiàn)?。?!

      四、你以為這就結(jié)束了嗎

      我是真的希望就這么結(jié)束了,那這個(gè)問題就很簡(jiǎn)單的解決了,順便還自以為是的發(fā)現(xiàn)了一個(gè)新知識(shí)。

      但是!

      這個(gè)bug轉(zhuǎn)給測(cè)試后,測(cè)試一測(cè),居然還是30多秒?。窟@是什么情況?。????

      我當(dāng)然是不信了,去測(cè)試電腦上執(zhí)行sql,還真是30多秒。。。

      我又回我的電腦上,連接同一個(gè)數(shù)據(jù)庫,一執(zhí)行sql,0.8秒???

      什么情況,同一個(gè)庫,同一個(gè)sql,怎么在兩臺(tái)電腦執(zhí)行的差距這么大!

      后來直接在服務(wù)器上執(zhí)行:



      ?醉了,居然還是30多秒。。。。

      那看來就是我電腦的問題了。

      后來我用多個(gè)同事的電腦實(shí)驗(yàn),最后得出的結(jié)論是:

      是因?yàn)槲矣玫腟QLyog!

      哎,現(xiàn)在發(fā)現(xiàn)了,只有用sqlyog執(zhí)行這個(gè)“優(yōu)化后”的sql會(huì)是0.8秒,在navcat和服務(wù)器上直接執(zhí)行,都是30多秒。

      那就是sqlyog的問題了,現(xiàn)在也不清楚sqlyog是不是做什么優(yōu)化了,這個(gè)慢查詢的問題還在解決中(我覺得問題可能是出在mysql自身的參數(shù)上吧)。

      這里只是記錄下這個(gè)坑,sqlyog執(zhí)行sql速度,和服務(wù)器執(zhí)行sql速度,在有的sql中差異巨大,并不可靠。

      ?

      五、后續(xù)(還未解決)

      感謝大家在評(píng)論里出謀劃策,我來回復(fù)下問題進(jìn)展:

      1.所謂的sqlyog查詢快,命令行查詢慢的現(xiàn)象,已經(jīng)找到原因了。是因?yàn)閟qlyog會(huì)在查詢語句后默認(rèn)加上limit
      1000,所以導(dǎo)致很快。這個(gè)問題不再糾結(jié)。

      2.我已經(jīng)試驗(yàn)過的方法(都沒有用):

      ①給app_account字段加索引。

      ②給sql語句后面加order by null。

      ③調(diào)整where條件里字段的查詢順序,有索引的放前面。

      ④給所有where條件的字段加組合索引。

      ⑤用子查詢的方式,先查where條件里的內(nèi)容,再去重。

      ?

      測(cè)試環(huán)境和現(xiàn)網(wǎng)環(huán)境數(shù)據(jù)還是有點(diǎn)不一樣的,我貼一張現(xiàn)網(wǎng)執(zhí)行sql的圖(1分鐘。。。):



      ?

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務(wù)器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點(diǎn)信息
      問題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          亚洲天堂导航 | 我和工厂少妇的性系列 | 北条麻妃中文字幕在线 | 美国三级欧美一级 | 大屌操的视频 | 欧美日韩国产一区二区在线观看一区 | 户外勾搭老头啪啪AV片 | 一级卖婬片AAAA片 | 黄色片免费视频网站 | 69成人网 |