一次date_add引發的命案

        我們在很多時候方便用mysql自帶的函數來得出計算的結果。比如涉及到日期的換算的時候,我們喜歡用date_add,date_sub和interval關鍵字來對日期進行範圍控制(可以用做條件等),但是效果往往不太理想,查詢時間很長,效率不高。

        比如我們想查兩個小時後,如下:

    select DATE_ADD('2015-10-15 22:00:03',INTERVAL 2 HOUR) from dual
        結果:

    2015-10-16 00:00:03
       這樣子看起來效率還好,然而在大量數據的時候,我們需要把時間作爲條件進行查詢的時候,這裏我們用到了date_add,date_sub 就會對性能造成很多影響,如:

       我們查具有上萬條數據的下圖結構的表,查詢條件是近20個小時的數據

       

       

    select instrument,open,high,low,last from onemin where DATE_ADD(Date,INTERVAL 20 hour) >= NOW() and instrument = 'GBPCHF'
      上面的語句執行很慢,大約在10幾秒,而且很容易造成阻塞。  而我們通過程序計算,可以得出20個小時前的時間。如下面的語句:

   select instrument,open,high,low,last from onemin where date >= 'xxxx-xx-xx xx:xx:xx' and instrument = 'GBPCHF'
       查詢的時間也就十幾毫秒,效率有個大的提高。

       所以我們總結對時間的操作的Tips1:直觀的傳值比較效率是比較高的


       Tips2:

        介紹一下mysql中計算百分比的方法:我們用concat(truncate((除數/被除數)*100,1),'%')的方式來計算。

        這裏1代表百分號裏面的小數位,可以是0,下面是例子:

    select concat(truncate((0.2*100),1),'%') from dual
        查看結果:

        20.0%

       當然我們想返回一個整的,把1改爲0就可以了。


        Tip3:

        有時候會無緣無故遇到lock wait timeout exceeded 我們連接上數據庫(分析原因可能是別人正在操作? 或者是自己的一條SQL語句造成了阻塞),進入cmd,登陸相應的數據庫,kill掉正在進行的進程。  show innodb status 查看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章