导读:

郑松华,知数堂SQL 优化班老师

现任 CCmediaService DBA,主要负责数据库优化相关工作

擅长SQL优化 ,数据核对

想内容请点击订阅专栏


大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子

今天给大家发一下 我的之前写的一篇文章,是关于 MySQL bug 91418
我们看bug 和学习处理方式的一个重要原因是以后碰到类似问题,不仅仅在MySQL。
在别的数据库或者语言中也可以触类旁通增加自己能力。

下面是bug链接

https://bugs.mysql.com/bug.php?id=91418

create table TEST_SUB_PROBLEM
(
UID integer PRIMARY KEY AUTO_INCREMENT
,BID VARCHAR(10)
,THING_NAME VARCHAR(100)
,OTHER_IFO VARCHAR(100)
);  insert into TEST_SUB_PROBLEM(BID,THING_NAME,OTHER_IFO)
values ('thing1','name1','look a chicken')
,( 'thing1','name1','look an airplane')
,('thing2','name2','look a mouse')
,('thing3','name3','look a taperecorder')
,('thing3','name3','look an explosion')
,('thing4','name4','look at the stars')
;   select
TST.UID
,TST.BID
,TST.THING_NAME
,TST.OTHER_IFO
,vw2.DIST_UID
from TEST_SUB_PROBLEM TST
join (  select uuid() as DIST_UID, vw.* from (  select DISTINCT BID, THING_NAME from TEST_SUB_PROBLEM   ) vw    ) vw2 on vw2.BID = TST.BID ;   

bug 的问题就是

select uuid() as DIST_UID, vw.*  from (  select DISTINCT BID, THING_NAME from TEST_SUB_PROBLEM   ) vw    +--------------------------------------+--------+------------+
| DIST_UID                             | BID    | THING_NAME |
+--------------------------------------+--------+------------+
| 00a993b0-cc29-11e8-9fff-080027158a34 | thing1 | name1      |
| 00a993d6-cc29-11e8-9fff-080027158a34 | thing2 | name2      |
| 00a993df-cc29-11e8-9fff-080027158a34 | thing3 | name3      |
| 00a993e5-cc29-11e8-9fff-080027158a34 | thing4 | name4      |
+--------------------------------------+--------+------------+      这里 DIST_UID 应该是4个 值 但是 原来的SQL 出现了6个不同的值
我查看了下原因 如下
root@mysql3308.sock>[test]>show warnings\G
*************************** 1. row ***************************  Level: Note Code: 1003
Message: /* select#1 */ select `test`.`TST`.`UID` AS `UID`,`test`.`TST`.`BID` AS `BID`,
`test`.`TST`.`THING_NAME` AS `THING_NAME`,`test`.`TST`.`OTHER_IFO` AS `OTHER_IFO`,uuid() AS `DIST_UID`
from `test`.`TEST_SUB_PROBLEM` `TST` join
(/* select#3 */ select distinct `test`.`TEST_SUB_PROBLEM`.`BID` AS `BID`,
`test`.`TEST_SUB_PROBLEM`.`THING_NAME` AS `THING_NAME` from `test`.`TEST_SUB_PROBLEM
`) `vw` where (`vw`.`BID` = `test`.`TST`.`BID`)
1 row in set (0.00 sec)

从上面的show warnings 可以发现 
uuid() AS `DIST_UID`  这个部分经过MySQL 转换之后挪到了最上层 所以导致最终有六个不同的值
我的环境是8.0 可以使用如下hint 就可以解决     select   /*+ set_var(optimizer_switch = 'derived_merge=off' ) */
TST.UID
,TST.BID
,TST.THING_NAME
,TST.OTHER_IFO
,vw2.DIST_UID
from TEST_SUB_PROBLEM TST
join (  select uuid() as DIST_UID, vw.* from (  select DISTINCT BID, THING_NAME from TEST_SUB_PROBLEM   ) vw    ) vw2 on vw2.BID = TST.BID ;   +-----+--------+------------+---------------------+--------------------------------------+
| UID | BID    | THING_NAME | OTHER_IFO           | DIST_UID                             |
+-----+--------+------------+---------------------+--------------------------------------+
|   1 | thing1 | name1      | look a chicken      | 3d65599a-cc26-11e8-9fff-080027158a34 |
|   2 | thing1 | name1      | look an airplane    | 3d65599a-cc26-11e8-9fff-080027158a34 |
|   3 | thing2 | name2      | look a mouse        | 3d655a0b-cc26-11e8-9fff-080027158a34 |
|   4 | thing3 | name3      | look a taperecorder | 3d655a1a-cc26-11e8-9fff-080027158a34 |
|   5 | thing3 | name3      | look an explosion   | 3d655a1a-cc26-11e8-9fff-080027158a34 |
|   6 | thing4 | name4      | look at the stars   | 3d655a25-cc26-11e8-9fff-080027158a34 |
+-----+--------+------------+---------------------+--------------------------------------+
6 rows in set (0.00 sec)    +----+-------------+------------------+------------+------+---------------+-------------+---------+--------------+------+----------+-----------------+
| id | select_type | table            | partitions | type | possible_keys | key         | key_len | ref          | rows | filtered | Extra           |
+----+-------------+------------------+------------+------+---------------+-------------+---------+--------------+------+----------+-----------------+
|  1 | PRIMARY     | TST              | NULL       | ALL  | NULL          | NULL        | NULL    | NULL         |    6 |   100.00 | Using where     |
|  1 | PRIMARY     | <derived2>       | NULL       | ref  | <auto_key0>   | <auto_key0> | 33      | test.TST.BID |    2 |   100.00 | NULL            |
|  2 | DERIVED     | <derived3>       | NULL       | ALL  | NULL          | NULL        | NULL    | NULL         |    6 |   100.00 | NULL            |
|  3 | DERIVED     | TEST_SUB_PROBLEM | NULL       | ALL  | NULL          | NULL        | NULL    | NULL         |    6 |   100.00 | Using temporary |
+----+-------------+------------------+------------+------+---------------+-------------+---------+--------------+------+----------+-----------------+ 从 show warnings 部分可以看出  uuid() AS `DIST_UID 在id =2 部分 运行出结果了 所以没有结果有4个值!   root@mysql3308.sock>[test]>show warnings\G
*************************** 1. row ***************************  Level: Note Code: 1003
Message: /* select#1 */ select /*+ SET_VAR(optimizer_switch='derived_merge=off') */ `test`.`TST`.`UID` AS `UID`,
`test`.`TST`.`BID` AS `BID`,`test`.`TST`.`THING_NAME` AS `THING_NAME`,`test`.`TST`.`OTHER_IFO` AS `OTHER_IFO`,
`vw2`.`DIST_UID` AS `DIST_UID` from `test`.`TEST_SUB_PROBLEM` `TST`
join (/* select#2 */ select uuid() AS `DIST_UID`,`vw`.`BID` AS `BID`,`vw`.`THING_NAME` AS `THING_NAME`
from (/* select#3 */ select distinct `test`.`TEST_SUB_PROBLEM`.`BID` AS `BID`,
`test`.`TEST_SUB_PROBLEM`.`THING_NAME` AS `THING_NAME` from `test`.`TEST_SUB_PROBLEM`)  `vw`) `vw2` where (`vw2`.`BID` = `test`.`TST`.`BID`)
1 row in set (0.00 sec) s/82991850

上面的问题是因为MySQL5.7 开始的视图合并功能引起的,如果是MySQL5.6 角度看的话 确实是bug,因为跟5.6 结果是不同的。
但是从另一个角度上说,这个也是无法解决的Bug。
因为这个问题的根本原因有一方面是视图合并,但更重要的是类似uuid() 这样的随着时间或者次数不停变化的函数特性,导致这种问题必然存在。

类似的函数还有sysdate() 

root@mysql3308.sock>[test]>select       -> TST.UID   -> ,TST.BID  -> ,TST.THING_NAME   -> ,TST.OTHER_IFO    -> ,vw2.DIST_UID     -> from TEST_SUB_PROBLEM TST -> join (    ->     select sysdate() as DIST_UID, vw.*  ,sleep(1) s   ->     from (    ->     select DISTINCT BID, THING_NAME from TEST_SUB_PROBLEM ->     ) vw  ->     ) vw2 on vw2.BID = TST.BID   ->     ;
+-----+--------+------------+---------------------+---------------------+
| UID | BID    | THING_NAME | OTHER_IFO           | DIST_UID            |
+-----+--------+------------+---------------------+---------------------+
|   1 | thing1 | name1      | look a chicken      | 2018-10-10 10:21:42 |
|   2 | thing1 | name1      | look an airplane    | 2018-10-10 10:21:42 |
|   3 | thing2 | name2      | look a mouse        | 2018-10-10 10:21:42 |
|   4 | thing3 | name3      | look a taperecorder | 2018-10-10 10:21:42 |
|   5 | thing3 | name3      | look an explosion   | 2018-10-10 10:21:42 |
|   6 | thing4 | name4      | look at the stars   | 2018-10-10 10:21:42 |
+-----+--------+------------+---------------------+---------------------+
6 rows in set (0.00 sec)    root@mysql3308.sock>[test]>select   /*+ set_var(optimizer_switch = 'derived_merge=off' ) */ -> TST.UID   -> ,TST.BID  -> ,TST.THING_NAME   -> ,TST.OTHER_IFO    -> ,vw2.DIST_UID     -> from TEST_SUB_PROBLEM TST -> join (    ->     select sysdate() as DIST_UID, vw.* ,sleep(1) s    ->     from (    ->     select DISTINCT BID, THING_NAME from TEST_SUB_PROBLEM ->     ) vw  ->     ) vw2 on vw2.BID = TST.BID   ->     ; +-----+--------+------------+---------------------+---------------------+
| UID | BID    | THING_NAME | OTHER_IFO           | DIST_UID            |
+-----+--------+------------+---------------------+---------------------+
|   1 | thing1 | name1      | look a chicken      | 2018-10-10 10:22:04 |
|   2 | thing1 | name1      | look an airplane    | 2018-10-10 10:22:04 |
|   3 | thing2 | name2      | look a mouse        | 2018-10-10 10:22:05 |
|   4 | thing3 | name3      | look a taperecorder | 2018-10-10 10:22:06 |
|   5 | thing3 | name3      | look an explosion   | 2018-10-10 10:22:06 |
|   6 | thing4 | name4      | look at the stars   | 2018-10-10 10:22:07 |
+-----+--------+------------+---------------------+---------------------+
6 rows in set (4.00 sec)

谢谢大家~ 欢迎转发

如有关于SQL优化方面疑问需要交流的,请加入QQ群(579036588),并@骑兔子的龟 就可与我联系

END


点击下图小程序订阅
《SQL优化专栏》
get更多优化技能

扫码加入MySQL技术Q群

(群号:579036588)

关于 MySQL bug 91418 一些看法相关推荐

  1. [MySQL Bug]DDL操作导致备库复制中断

    ----------------- 在MySQL5.1及之前的版本中,如果有未提交的事务trx,当执行DROP/RENAME/ALTER TABLE RENAME操作时,不会被其他事务阻塞住.这会导致 ...

  2. 从MySQL Bug#67718浅谈B+树索引的分裂优化

    从MySQL Bug#67718浅谈B+树索引的分裂优化 1月 6th, 2013 发表评论 | Trackback 问题背景 今天,看到Twitter的DBA团队发布了其最新的MySQL分支:Cha ...

  3. 项目纪实丨MySQL Bug引发客户现场升级失败 万里DBA 6小时攻克难关

    上午10:00 某运营商核心报表平台升级前夕 作为万里数据库的战略合作伙伴,某运营商一直密切关注着国产数据库的发展.其系统中一套基于MySQL8.0.11版本的核心报表平台,近期由于存在安全扫描的漏洞 ...

  4. 这个 MySQL bug 99% 的人会踩坑!

    这周收到一个 sentry 报警,如下 SQL 查询超时了. select * from order_info where uid = 5837661 order by id asc limit 1 ...

  5. 这个 MySQL bug 让我大开眼界

    这周收到一个 sentry 报警,如下 SQL 查询超时了. select * from order_info where uid = 5837661 order by id asc limit 1 ...

  6. 如何从头到脚彻底解决一个MySQL Bug

    摘要:为了保障华为云GaussDB产品的可靠性,每一款产品发布前都要通过多轮严苛的测试用例. 说明:本文中的MySQL,如果不做特殊说明,指的是开源社区版MySQL. 华为云数据库新版本在发布之前,会 ...

  7. mysql索引如何分裂节点_从MySQL Bug#67718浅谈B+树索引的分裂优化(转)

    原文链接:http://hedengcheng.com/?p=525 问题背景 今天,看到Twitter的DBA团队发布了其最新的MySQL分支:Changes in Twitter MySQL 5. ...

  8. MySQL Bug一例-----ibuf cursor restoration fails

    产生原因: 1.开启change buffer(innodb_change_buffering) 2.对表进行大量delete 操作 3.对相同表进行truncate bug名称:ibuf curso ...

  9. mysql bug frash_MySQL Flush导致的等待问题

    --MySQL Flush导致的等待问题 -------------------------------2014/07/13 前言 在实际生产环境中有时会发现大量的sql语句处于waiting for ...

  10. 一次生产慢响应问题排查:TRUNCATE TABLE (MySQL Bug 68184)

    I.背景 生产环境观察到有时间规律的慢接口响应(每天固定时间点集中出现),需要解决接口有规律的慢响应问题. II .问题排查流程 1.观察skywalkiing定位具体接口响应慢的节点.(初步定位都是 ...

最新文章

  1. DIV+CSS笔记(一)
  2. JavaScript实现hornerMethod霍纳法算法(附完整源码)
  3. jstl中c:forEach的用法
  4. python gui编程 从入门到项目实战_python GUI编程 QT5开发项目实战
  5. [翻译] ABCIntroView
  6. Java生产环境下性能监控与调优详解 大纲 学习感悟
  7. struts2学习之基础笔记1
  8. protobuf 编码实现解析(java)
  9. synchronized()_synchronized 和 ReentrantLock 有什么区别?
  10. 【MVC】VS常用技巧
  11. 旧版sai笔刷_最详细的SAI笔刷设置教程,非常全面详细!
  12. [Python] GAMP结果文件批量统计与绘图
  13. 吉林大学计算机学院杜天宇,2016年全国研究生数学建模竞赛获奖名单
  14. macos备份文件服务器地址,mac电脑备份文件的最佳方法
  15. html onload状态事件,HTML onload事件用法及代码示例
  16. 守护“城市生命线” | 地空智能带您走进数字孪生地下管网
  17. Python玩转《生僻字》
  18. 2022 新版本c++安装opencv库的简单操作教程
  19. 如何低成本挖掘App商店的免费资源
  20. Java毕业设计:校园二手闲置物品交易网站(java

热门文章

  1. java simon_Java程序监控API Java Simon
  2. 使用Spark MLlib进行情感分析
  3. 谈谈前端浏览器兼容和性能优化
  4. python实现触摸精灵功能_触摸精灵实现找图功能
  5. DB2JAVIT RC 9505
  6. 网页webp格式转换成jpg方法
  7. win10java怎么打开_图文传授win10如何打开java控制面板的解决本领
  8. 企业邮箱如何设置邮件监控
  9. 我的wow血精灵圣骑士,晒晒
  10. 【CF724F】Uniformly Branched Trees