mysql按月统计数据时如何优化

当业务数据比较多的时候,需要按月统计,并使用分组的语句进行处理,sql如下:

SELECT DATE_FORMAT(T.ORDRE_TIME, '%Y-%m-%d') TEH_DAY,COUNT(T.ORDER_ID) ORDER_NUM,SUM(T.PRINT_PAGES) PAPER_NUM
        FROM trorder T
        WHERE DATE_FORMAT(T.ORDRE_TIME, '%Y-%m')  = #{criteria.theMonth}
        AND T.INFO_SOURCE = '0002'
        AND T.ORDER_STATE = '0002'
group by DATE_FORMAT(T.ORDRE_TIME, '%Y-%m-%d')

因为主要使用了DATE_FORMAT(T.ORDRE_TIME, '%Y-%m') 来筛选本月数据,导致执行较慢,大致需要7秒左右,请问有没有好的优化方式

把 DATE_FORMAT(T.ORDRE_TIME, '%Y-%m') = #{criteria.theMonth}
改成
T.ORDRE_TIME >= 本月开始时间 and T.ORDRE_TIME <= 本月结束时间
试试

  • 建议你看下这篇博客👉 :Mysql 按当天、当月、上月及按日期范围查询 DATE_FORMAT( date, ‘%Y%m‘ )
  • 除此之外, 这篇博客: Mysql查询语法总结中的 6、将日期转换为字符串或者理解为格式化日期:date_format(‘2021-01-02’, ‘%y-%m-%d’); 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • select str_to_date(now(), '%y/%m/%d');		//返回:21/03/15
    
    序号格式符功能
    1%Y四位的年份
    2%y两位的年份
    3%m月份(01,02,…,12)
    4%c月份(1,2,3,…,12)
    5%d日(01,02,…)
    6%H小时(24小时制)
    7%h小时(12小时制)
    8%i分钟(00,01,02,…,59)
    9%s秒(00,01,02,…,59)
  • 以下回答由chatgpt基于相关博客总结生成:

    我对优化建议进行如下回答: 1. 如果我使用MySQL数据库,我需要考虑使用哪个版本的MySQL,因为不同版本的MySQL提供不同的优化机制。例如,MySQL 5.6以上版本支持索引下推,可以在子查询和联合查询中提高搜索效率。 2. 如果我的业务数据量较大,我需要考虑使用索引和分表来优化查询。我需要在ORDRE_TIME字段上创建索引,并且也可以将大表分成多个小表,每个小表只包含某个时间范围内的数据,例如按月份分表或按季度分表等。这样可以减少一次查询涉及到的数据量,从而提高查询速度。 3. 我可以使用JOIN或者子查询等语句,将数据分组计算后再进行筛选,从而减少执行时间。 4. 如果我的查询语句中包含大量的计算或者字符串操作,我可以考虑使用存储过程或者视图等机制,将这些计算操作提前完成,减少查询时的计算量。 总结起来,针对业务数据量较大,按月统计数据的查询,我可以使用MySQL的索引和分表机制,使用JOIN或者子查询等语句进行数据分组计算,使用存储过程或者视图等机制提前完成大量计算操作,从而实现优化。