WHERE条件使用静态参数函数时SQL查询性能问题咨询
关于MySQL yearweek函数静态调用的性能问题解答
函数计算次数结论
入参全为静态常量、不依赖行数据的yearweek()只会在查询执行前计算1次,不会逐行重复计算。
MySQL查询优化器会自动识别确定性函数的静态调用场景:只要函数输出仅由入参决定,且入参都是固定值,优化器会在执行计划生成阶段就完成函数计算,将结果作为常量代入过滤逻辑,和直接写死数值的执行效率完全一致。
你可以通过EXPLAIN语句分别执行两个版本的查询验证,二者生成的执行计划、过滤常量完全相同,没有性能差异。
是否需要提前计算为常量
- 常规场景不需要:直接写
yearweek(日期)的可读性远高于写死的数值,后续维护时不需要额外推算数值对应的日期范围,也不会有性能损失。 - 特殊场景建议提前计算:
- 需要兼容不支持
yearweek函数的异构数据库 - 要避免不同实例的周规则配置差异(比如周起始日设置不同)导致
yearweek输出结果不一致 - 需要做极细粒度的执行计划强制管控
- 需要兼容不支持
原始查询示例
select e_name from my_table where year_week between yearweek('2021-11-10') and yearweek('2021-11-18');
提前计算常量后的查询示例
select e_name from my_table where year_week between 202145 and 202146;
内容的提问来源于stack exchange,提问作者dina
相关产品推荐
相关产品推荐

