热度 1||
问题描述
相同SQL在不同MySQL版本中查询相同数据的查询结果不一致,高版本8.0.32查询结果符合预期(查询有结果),低版本8.0.25查询结果不符合预期(查询无结果)。
分析:业务SQL包含用户自定义变量赋值,SQL在不同版本的执行计划不一样,推测可能受optimizer_switch的影响。
BUG定位
参考:https://bugs.mysql.com/bug.php?id=104918
简单理解: 子查询中有用户变量的情况,派生条件下推后,有时会影响子查询中用户变量的求值分配结果。
bug修复
bug 104918,在 MySQL 8.0.28修复。
参考:
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-28.html
http://dev.mysql.com/doc/refman/8.0/en/derived-condition-pushdown-optimization.html
bug规避
对于低于MySQL 8.0.28的版本,可以在特定sql中添加 /*+ NO_DERIVED_CONDITION_PUSHDOWN() */ ,在特定的查询中禁用derived_condition_pushdown优化。
全局地关闭 derived_condition_pushdown 可以在配置文件中添加 optimizer_switch='derived_condition_pushdown=off'
问题sql中添加 /*+ NO_DERIVED_CONDITION_PUSHDOWN() */ 禁用derived_condition_pushdown优化后,在MySQL 8.0.25 中出现了符合预期的正确结果。
合作电话:010-64087828
社区邮箱:greatsql@greatdb.com