MySQL中DATE()函数在JOIN的ON条件中会导致索引失效,应改用范围查询+子查询/CTE:先WHERE b.ts >= '2026-08-12' AND b.ts
MySQL中用DATE()函数截断时间戳再JOIN
直接在ON条件里对时间字段做函数运算(比如
DATE(a.ts) = DATE(b.ts))会导致索引失效,哪怕两边都有ts字段的B+树索引,优化器也会放弃使用,转为全表扫描。正确做法是先用范围条件缩小右表候选集,再在子查询或CTE里做日期截断:
- 确保
b.ts上有索引:CREATE INDEX idx_b_ts ON b(ts);- 用
WHERE b.ts >= '2026-08-12' AND b.ts 替代<code>DATE(b.ts) = '2026-08-12'- 若必须用
DATE(),只在SELECT列表或WHERE中用于已过滤后的结果,绝不放在JOIN条件里PostgreSQL里用CAST(ts AS DATE)配合B-tree索引
PostgreSQL对
CAST(ts AS DATE)的支持比MySQL更友好,但依然不能直接在JOIN的ON里写CAST(a.ts AS DATE) = CAST(b.ts AS DATE)——这仍会阻止索引下推。推荐组合方式:
- 给
b.ts建表达式索引:CREATE INDEX idx_b_ts_date ON b((ts::DATE));- JOIN时显式使用该表达式:
ON (a.ts::DATE) = (b.ts::DATE)- 注意:表达式索引只对完全匹配该表达式的查询生效,
DATE(b.ts)或CAST(b.ts AS DATE)都行,但TO_CHAR(b.ts, 'YYYY-MM-DD')不行SQL Server中避免在ON里用CONVERT(DATE, ...)
SQL Server虽然支持
CONVERT(DATE, GETDATE()),但在JOIN条件中写CONVERT(DATE, a.ts) = CONVERT(DATE, b.ts)会让执行计划跳过索引查找,降级为嵌套循环+全表扫描。更安全的写法是用范围谓词代替:
- 把等日期逻辑改写为区间:
ON b.ts >= CAST(a.ts AS DATE) AND b.ts- 确保
b.ts列上有索引,且类型是DATETIME2或DATETIME(SMALLDATETIME精度不够)- 如果业务允许,建计算列+索引:
ALTER TABLE b ADD ts_date AS CAST(ts AS DATE); CREATE INDEX idx_b_ts_date ON b(ts_date);跨数据库通用原则:别让函数出现在JOIN条件左侧
所有主流数据库(MySQL/PostgreSQL/SQL Server)在处理JOIN时,对ON子句中带函数的字段都极不友好。真正起作用的是“可下推的谓词”,而不是看起来简洁的函数调用。
容易被忽略的关键点:
DATE()、CAST(... AS DATE)、CONVERT(DATE, ...)这些操作本身不慢,慢在它们让优化器无法估算基数,进而放弃索引- 时间窗口预过滤(如
BETWEEN或开闭区间)永远比函数截断优先级更高- 如果JOIN后还要按日期分组统计,建议在JOIN前就用CTE或子查询把日期字段提前算好,避免重复计算
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。
5023
2023.10.12
SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
1031
2023.10.27
在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。
1309
2024.02.23
SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。
7081
2024.03.06
sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。
3723
2024.03.06
运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。
7060
2024.04.07
sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。
1350
2024.04.29
本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。
100
2026.11.12
热门下载
相关下载
精品课程
共6课时 | 12.1万人学习
共79课时 | 161.8万人学习
共6课时 | 54.7万人学习
最新文章










