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 的過濾條件.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-2686770/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 子查詢包含where ..or在Corelated Subquery 中語句中問題
- MySQL UDF的除錯方式 - debugview (轉)MySql除錯View
- mysql UDF提權MySql
- MySQL UDF 提權初探MySql
- Linux 提權-MySQL UDFLinuxMySql
- MySQL where 運算子MySql
- MySQL-where 1=1MySql
- Linux利用UDF庫實現Mysql提權LinuxMySql
- MySQL最佳化WHERE子句(轉)MySql
- 詳解MySQL中WHERE子句的用法MySql
- MySQL核心技術之“WHERE條件”MySql
- GORM subquery 子查詢GoORM
- MySQL 鎖bug?MySql
- mysql bug 55981MySql
- mysql 安全bugMySql
- MySQL之Where和Having的區別MySql
- php資料庫之mysql(where、orderBy、Update)PHP資料庫MySql
- MySQL怎樣最佳化WHERE子句(轉)MySql
- mysql 左連結 left join 條件寫在where 後面與 on後面的區別MySql
- 在select 中的where 中使用indexIndex
- MySQL 索引優化 Using where, Using filesortMySql索引優化
- MySQL-WHERE子句 以及 邏輯操作符MySql
- MERGE新特性(UPDATE WHERE,DELETE WHERE,INSERT WHERE)delete
- MySQL儲存過程中處理陣列 UDF程式碼分享MySql儲存過程陣列
- mysql中delete fro mysql.user where XX和drop user的不同MySqldelete
- Select from subquery 子查詢
- mysql,where條件查詢等學習筆記MySql筆記
- mysql的having和where有什麼區別MySql
- Mysql-left join on後接and,和where的區別MySql
- 使用mysql_udf與curl庫完成http_post通訊模組示例MySqlHTTP
- mysql explain的bug薦MySqlAI
- Mysql bug列表、論壇MySql
- Hive中的UDF詳解Hive
- 開發hive UDF函式Hive函式
- Percona MySQL 5.6 WHERE 條件中 OR 的索引測試MySql索引
- mysql where條件中 字串右邊的空格會忽略MySql字串
- MYSQL學習筆記6: DQL條件查詢(where)MySql筆記
- mysql 原生 線上DDL 的bug .MySql