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