温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MySQL UDF 在 in ( subquery where ) bug

发布时间:2020-08-07 02:32:07 来源:ITPUB博客 阅读:102 作者:babyyellow 栏目:MySQL数据库

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)  

MySQL UDF  在   in ( subquery where ) bug

这个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 

MySQL UDF  在   in ( subquery where ) bug

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

但是  在  5.6.32  5.7.26 执行起来很慢    

5.5.9 跟 8.19 相对较快

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

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI