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,提问作者배효성
相关产品推荐
相关产品推荐

