You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中日期拼接查询无法使用索引的解决方案咨询

优化方案:避免对索引列使用函数,改用常量转换

优化后的SQL语句

根据你使用的数据库,选择对应的写法:

MySQL/MariaDB

SELECT *
FROM `table`
WHERE DATE('2022-09-30 13:05:30.000') BETWEEN start_date AND end_date

SQL Server

SELECT *
FROM [table]
WHERE CAST('2022-09-30 13:05:30.000' AS DATE) BETWEEN start_date AND end_date

PostgreSQL

SELECT *
FROM "table"
WHERE DATE '2022-09-30 13:05:30.000' BETWEEN start_date AND end_date

优化原理

原查询中对start_date和end_date调用concat函数,属于对索引列进行函数运算,这种情况下数据库无法直接利用这两个字段上的索引(除非专门创建函数索引,但会带来额外维护开销)。

优化后的逻辑是反向处理:将查询的时间常量转换为yyyy-MM-dd类型的日期值,再与start_date、end_date直接比较。此时start_date和end_date作为索引列直接参与条件判断,数据库可以正常使用索引快速筛选数据。

这个写法和原查询的逻辑完全等价:原查询判断目标时间落在start_date当天0点到end_date当天23:59:59.999之间,优化后的写法通过提取目标时间的日期部分,判断该日期在start_date到end_date的区间内,结果完全一致。


内容的提问来源于stack exchange,提问作者배효성

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:35:25