mysql 查询当日数据
在本次大屏项目的开发过程中, 我主要用 java 写后端接口,为大屏提供数据,这里不写接口的设计,直接总结写 sql 语句的一些心得吧。
需求:
在页面需要统计功能的时候,可能需要展示当天、本年,本季度、本月、本周的数据,当数据量多了之后,查询效率和如何写 sql 语句实现都是需要考虑的问题,下面我就以最简单的查当日数据做一个简单的分析与总结
- 写法一:
1 | SELECT |
- 写法二:
1 | SELECT |
分析:
写法一和写法二,经过我的实际测试,在没有加索引的情况下,查询效率是差不多的,我测试的表有 170 万条数据,每天还在大量的新增数据,在本地查询数据是 8 秒多,这样的查询速度肯定是不能忍受的;
在给 regid 字段和 createtime 加了索引后,查询数据有了天与地的巨大差别,直接上图:
总结:
在数据量超过 10w 条以后,通过实际检验,在查询数据库的过程中就不建议使用to_days()
这样的数据量内置函数了,这样会导致内部数据大量的复制计算,最后才去做比较,这样性能消耗太大了,能直接用程序去计算,然 sql 查询语句只做最简单的大于,小于,等于这样的比较就好了,这样效率能达到比较好的结果。
同理查询当年数据,查询当月数据,查询当前季度,查询本周数据都是这么个道理,如何写相关的 sql 语句,参考博客;
特别说明:
因为我是使用 Java 开发后端接口,所以直接使用mybatis plus一把梭哈了,简单高效!
1 | // 获取一个时间,并格式化 |
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 获取到分钟 |