5,6百万的数据中秒杀数据查询to_days与curdate对比curdate效率高

SQL查询优化实践

作者官方网站:http://www.wxl568.cn

首先感谢公司的环境与DB,在5,6百万的数据中秒杀数据查询to_days与curdate

to_days速度在2秒左右再高峰期,中效率会使DB数据cpu报警

curdate速度在0.几秒左右

 

explain select L.EMP_CODE AS empCode,

L.EQUIPMENT_NO AS equipmentNo,
L.CLOCK_TIME AS clockTime,
L.MAC_ADDRESS AS macAddress
from tt_clock_log_pd L where
to_days(L.CLOCK_TIME) = to_days(now()) 
and L.EQUIPMENT_NO='869159020000810'
and L.MAC_ADDRESS ='20:82:c0:1e:1a:a2';



速度比上面的快
explain select L.EMP_CODE AS empCode,
L.EQUIPMENT_NO AS equipmentNo,
L.CLOCK_TIME AS clockTime,
L.MAC_ADDRESS AS macAddress
from tt_clock_log_pd L where
L.CLOCK_TIME >= curdate() 
and L.EQUIPMENT_NO='869159020000810'
and L.MAC_ADDRESS ='20:82:c0:1e:1a:a2';

### SQL 查询中 `DATE_SUB(CURDATE(), INTERVAL 6 MONTH)` 的含义 在 SQL 中,`DATE_SUB` 是一个用于日期计算的函数,它从指定的日期中减去一个时间间隔。具体到 `DATE_SUB(CURDATE(), INTERVAL 6 MONTH)`,其功能是计算当前日期(由 `CURDATE()` 提供)向前推 6 个月的日期[^1]。 #### 函数分解 - **`CURDATE()`**:返回当前日期,不包含时间部分。例如,如果今天是 `2023-10-15`,那么 `CURDATE()` 的结果为 `2023-10-15`。 - **`INTERVAL 6 MONTH`**:表示一个时间间隔,具体为 6 个月。 - **`DATE_SUB`**:从第一个参数(这里是 `CURDATE()`)中减去第二个参数(这里是 `INTERVAL 6 MONTH`)的时间间隔。 因此,`DATE_SUB(CURDATE(), INTERVAL 6 MONTH)` 的结果是从当前日期向前推 6 个月的日期。例如,如果当前日期是 `2023-10-15`,则结果为 `2023-04-15`。 #### 示例 以下是一些具体的例子来展示 `DATE_SUB` 的工作方式: | 输入表达式 | 结果 | |----------------------------------------------|--------------| | `DATE_SUB('2023-10-15', INTERVAL 6 MONTH)` | `2023-04-15` | | `DATE_SUB('2023-01-15', INTERVAL 6 MONTH)` | `2022-07-15` | | `DATE_SUB('2023-03-31', INTERVAL 6 MONTH)` | `2022-09-30` | 需要注意的是,当日期跨越不同的月份时,MySQL 会自动调整日期以确保结果合理。例如,从 `2023-03-31` 减去 6 个月的结果是 `2022-09-30`,因为 2022 年 9 月没有 31 日[^2]。 #### 在查询中的应用 在用户提供的 SQL 查询中,`DATE_SUB(CURDATE(), INTERVAL 6 MONTH)` 被用来限定数据的时间范围,确保只统计过去 6 个月内的数据(不包括当前月份)。例如,假设当前日期为 `2023-10-15`,那么 `DATE_SUB(CURDATE(), INTERVAL 6 MONTH)` 的结果为 `2023-04-15`,这意味着查询将筛选出 `shipment_date` 在 `2023-04-15` 到 `2023-10-01`(不包括当天)之间的记录。 ### 替代方法 虽然 `DATE_SUB` 是一种常见的日期操作方式,但也可以使用 `DATE_ADD` 来实现类似的功能。例如,`DATE_SUB(CURDATE(), INTERVAL 6 MONTH)` 可以通过以下方式替代: ```sql DATE_ADD(CURDATE(), INTERVAL -6 MONTH) ``` 这种写法在逻辑上等价,但可能对某些开发者来说更直观[^1]。 ### 注意事项 1. 如果需要排除当前月份的数据,可以结合 `DATE_FORMAT(CURDATE(), '%Y-%m-01')` 来进一步限制条件。 2. 在处理大量数据时,确保 `shipment_date` 字段上有适当的索引以优化查询性能。 ```sql WHERE shipment_date >= DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'), INTERVAL 6 MONTH) AND shipment_date < DATE_FORMAT(CURDATE(), '%Y-%m-01') ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值