MySQL[bug] 子查询含用户变量,派生条件下推将导致不同版本的查询结果不一致 ...

问题描述

 相同SQL在不同MySQL版本中查询相同数据的查询结果不一致,高版本3.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 中出现了符合预期的正确结果。