一次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 查看。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值