关于DATE_SUB的sql查询执行慢的优化

发布时间 2023-10-08 14:41:47作者: m5n7xiao

背景:

       因为订单表是分表的,需要每天定时从不同订单表里获取7天前到当前时间的数据。归档到一个表中进行统计分析之类的计算。因为每张表数据量比较大(千万级的数据),ORDER_CREATE_TIME 是创建了索引的。ORDER_CREATE_TIME 的 type 是 datetime 类型,通过 ORDER_CREATE_TIME >= DATE_SUB(SYSDATE(),INTERVAL 7 DAY) 作为条件。大家都知道 DATE_SUB 函数,这里就不做特别的解释。

 

        

 

问题:

       使用条件 WHERE ORDER_CREATE_TIME >= DATE_SUB(SYSDATE(),INTERVAL 7 DAY)   运行起来贴别慢,差不多一个小时才能跑完数据。

分析:

      使用 EXPLAIN  执行计划分析一下。以下是一部分测试数据执行。

1、通过执行计划看看使用  WHERE ORDER_CREATE_TIME >= DATE_SUB(SYSDATE(),INTERVAL 7 DAY)  的情况。

      

    发现是 type 是 index    (  type扫描方式由快到慢     system > const > eq_ref > ref > range > index > all  )

    index类型,需要扫描索引上的全部数据,它仅比全表扫描快一点

2、通过执行计划  直接将条件修改为时间:WHERE ORDER_CREATE_TIME >= '2023-08-17 00:00:00'

   

      type 是 ref

 经测试,原来需要跑一个小时的数据,改为第2种后 不到一分钟数据就跑完了。

总结: sql 中使用函数了,虽然走了索引,但全表扫描了。

所以大家如果用到类似的条件,可以考虑传参数。而不用函数。