MySQL UDF 在 in ( subquery where ) bug

babyyellow發表於2020-04-17



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 的過濾條件.  












來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-2686770/,如需轉載,請註明出處,否則將追究法律責任。

相關文章