千家信息网

MySQL UDF 在 in ( subquery where ) bug

发表于:2025-01-25 作者:千家信息网编辑
千家信息网最后更新 2025年01月25日,SELECT 45, COUNT(0)FROM ac_dealer_sales dsWHERE ds.user_id in (SELECT du.user_id FROM ac_dept_user d
千家信息网最后更新 2025年01月25日MySQL UDF 在 in ( subquery where ) bug

SELECT 45, COUNT(0)
FROM ac_dealer_sales ds
WHERE ds.user_id in (SELECT du.user_id FROM ac_dept_user du
WHERE du.is_main = 1 AND fun_get_team_id(du.dept_id)= 23)

这个sql 期望的返回值 是 5000.

但是实际执行的返回值 是 8000.

把这个sql 拆为 一个 select count(*) from tab where id in ( selectd id from tab).

tab = ( create table tab as ( subquery) )

sub query 中 包含了 一个UDF fun_get_team_id( int) return int

结果与期望结果是一直的.

测试了4个版本。 5.5.9 5.6.32 5.7.26 8.0.19

发现这样的语句只有在5.5.9 上是正确的

如果 UDF 在 selectd * from tab where id in ( select * from tab where UDF() .... )

这种形式的 sql 语句中. mysql 执行计划 忽略了 UDF 的存在. 导致结果不准确.

将 语句改写为 一个 tab 与一个 subquery 关联 的写法. 结果是正确的.

SELECT COUNT(1)
FROM ac_dealer_sales a,(SELECT du.user_id FROM ac_dept_user du
WHERE du.is_main = 1 AND fun_get_team_id(du.dept_id)= 23) b
WHERE a.user_id = b.user_id

这种情况下, 在 4个版本的 mysql 中都可以执行.

但是 在 5.6.32 5.7.26 执行起来很慢

5.5.9 跟 8.19 相对较快

UDF 单独 在 select 部分, 还是 在 where 部分 都没有问题.

跟 UDF 本身的实现逻辑没有关系. 但是在 IN ( ) 子句中 执行计划 则忽略了 UDF 的过滤条件.

0