我们在很多时候方便用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 查看。