mysql查询当日数据

mysql 查询当日数据

在本次大屏项目的开发过程中, 我主要用 java 写后端接口,为大屏提供数据,这里不写接口的设计,直接总结写 sql 语句的一些心得吧。

需求:

在页面需要统计功能的时候,可能需要展示当天、本年,本季度、本月、本周的数据,当数据量多了之后,查询效率和如何写 sql 语句实现都是需要考虑的问题,下面我就以最简单的查当日数据做一个简单的分析与总结

  1. 写法一:
1
2
3
4
5
6
7
SELECT
*
FROM
表名
WHERE
regid = 'xxxx'
AND TO_DAYS( createtime ) = TO_DAYS( now() );
  1. 写法二:
1
2
3
4
5
6
7
8
SELECT
*
FROM
表名
WHERE
regid = 'xxxx'
AND createtime >= '2019-10-27 00:00:00'
AND createtime < '2019-10-28 00:00:00'

分析:

写法一和写法二,经过我的实际测试,在没有加索引的情况下,查询效率是差不多的,我测试的表有 170 万条数据,每天还在大量的新增数据,在本地查询数据是 8 秒多,这样的查询速度肯定是不能忍受的;mysql慢
在给 regid 字段和 createtime 加了索引后,查询数据有了天与地的巨大差别,直接上图:
mysql快

总结:

在数据量超过 10w 条以后,通过实际检验,在查询数据库的过程中就不建议使用to_days()这样的数据量内置函数了,这样会导致内部数据大量的复制计算,最后才去做比较,这样性能消耗太大了,能直接用程序去计算,然 sql 查询语句只做最简单的大于,小于,等于这样的比较就好了,这样效率能达到比较好的结果。
同理查询当年数据,查询当月数据,查询当前季度,查询本周数据都是这么个道理,如何写相关的 sql 语句,参考博客

特别说明:

因为我是使用 Java 开发后端接口,所以直接使用mybatis plus一把梭哈了,简单高效!

1
2
3
4
5
6
		// 获取一个时间,并格式化
Date datetime = (param.getInputTime() == null || param.getInputTime() == "") ? new Date() : DateUtils.parseDate(param.getInputTime());
QueryWrapper<User> queryWrapper = new QueryWrapper<>();//创建一个查询构造器
// 不需要查询所有字段,所以只需要我需要的字段。
queryWrapper.select("name", "createtime" ).eq("streetname", param.getStreetName()).ge("createtime", DateUtils.getMonthBeginTime(datetime)).lt("createtime", DateUtils.getMonthEndTime(datetime)).orderByDesc("createtime");
List<User> selectList = rxajDao.selectList(queryWrapper); //拿到数据

DateUtils.getMonthBeginTime()这个写的一个静态工具类,只需要传入一个时间,就自动得到这个月的开始时间,DateUtils.getMonthEndTime()获取本月的结束时间,同理可以直接写获取当天开始时间和当天结束时间的方法,去查询当日的所有数据,这个只需要一个 java 的时间工具类就可以了,这个在网上找一大把这里就不推荐了,找到后,自己适当的改改一般没啥大问题;

mysql 常用时间类的内置函数:

函数 说明 示例语句 结果
curdate() 获取当天的日期 yyyy-mm-dd select curdate(); 2019-11-15
curtime() 获取到当前时间点,精确到秒,HH:mm:ss select curtime(); 11:33:44
now() 获取当前时间 yyyy-mm-dd HH:mm:ss select now(); 2019-11-15 11:35:05
unix_timestamp() 时间戳 select unix_timestamp(now()) 1573789055
from_unixtime() 将时间戳转为时间 select from_unixtime(1573788997); 2019-11-15 11:36:37
year() 获取年份 select year(now()); 2019
week() 获取本年的第几周 select week(now()) 45;表示今天是 2019 年的第 45 周
hour() 获取小时数 select hour(curtime()) 11
minute() 获取分钟数 select minute(curtime()) 44,代表现在是 44 分钟
monthname() 获取月份英文名 select monthname(now()); November
month() 获取月份数 select month(now()); 11
date_format(时间,格式) 格式化时间 select date_format(now(),”%Y-%m-%d %H:%i”); 2019-11-15 11:47 获取到分钟
您的打赏,是我创作的动力,谢谢支持。
0%