MySQL 8.0.22 Bug #101504 對應解決思路

大家好,我是知數堂SQL 優化班老師 網名:騎龜的兔子
版本 :Server version: 8.0.22 MySQL Community Server - GPL
由於種種原因,需要把視圖合併功能關掉,但是就碰到了,如下問題。
如果不關掉下面的問題就不會碰到。


set session optimizer_switch='derived_merge=off';
SELECT a.*, b.* FROM ( SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES t WHERE TABLE_SCHEMA NOT IN ('information_schema','performance_schema','mysql','sys') AND TABLE_TYPE = 'BASE TABLE' AND TABLE_ROWS >= 10000 ) AS a LEFT JOIN ( SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLE_CONSTRAINTS c WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' ) AS b USING (TABLE_SCHEMA, TABLE_NAME) WHERE b.TABLE_NAME IS NULL ORDER BY TABLE_ROWS DESC;ERROR 3566 (HY000): Access to native function 'internal_table_rows' is rejected.


官方bug 鏈接 : https://bugs.mysql.com/bug.php?id=101504
這個問題比較直接 internal_table_rows 這個內部函數不能使用導致。
也就是說視圖合併關掉之後有個外部條件直接推進到裏面,在生成 table_rows 之前 直接訪問使用了。
我們看下8.0.22 版本中相應的參數 
derived_condition_pushdown,  https://dev.mysql.com/doc/refman/8.0/en/derived-condition-pushdown-optimization.html

正好符合我們的預期
set session optimizer_switch='derived_merge=off,derived_condition_pushdown=off';
SELECT a.*, b.* FROM( SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES t WHERE TABLE_SCHEMA NOT IN ('information_schema','performance_schema','mysql','sys') AND TABLE_TYPE = 'BASE TABLE' AND TABLE_ROWS >= 10000 ) AS a LEFT JOIN ( SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLE_CONSTRAINTS c WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' ) AS b USING (TABLE_SCHEMA, TABLE_NAME) WHERE b.TABLE_NAME IS NULL ORDER BY TABLE_ROWS DESC;+--------------+------------------+------------+--------------+------------+| TABLE_SCHEMA | TABLE_NAME | TABLE_ROWS | TABLE_SCHEMA | TABLE_NAME |+--------------+------------------+------------+--------------+------------+| employees | dept_emp2 | 331008 | NULL | NULL || employees | emp2 | 299590 | NULL | NULL || employees | salaries2 | 2837194 | NULL | NULL || employees | salaries4_up_20w | 249796 | NULL | NULL || employees | t11_1 | 99450 | NULL | NULL || employees | t_group4 | 2615040 | NULL | NULL || employees | t_group5 | 2165088 | NULL | NULL || test | history | 30020 | NULL | NULL |+--------------+------------------+------------+--------------+------------+


這樣,解決了這個奇葩問題。

新特性固然很好,但是還需要檢驗和掌握對應問題的解決方案,如果不是8.0.22版本碰到這個問題,也可以利用修改SQL的方法解決該問題。

這個問題在8.0.23已得到修復。



我的新一輪的SQL 優化課 即將在春節後開課 

我是知數堂SQL 優化班老師~ ^^

如有關於SQL優化方面疑問和一起交流的請加 並且 @兔子@知數堂SQL優化

高性能MySQL,SQL優化羣 有葉金榮,吳炳錫 兩位大神坐鎮 :579036588

歡迎加入 知數堂大家庭。

我的微信公衆號:SQL開發與優化(sqlturning)


掃碼直達寶藏課程


本文分享自微信公衆號 - 老葉茶館(iMySQL_WX)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章