当前位置: 首页 > news >正文

尴尬的bug:一条查询语句让MySQL崩溃

这是学习笔记的第 2028 篇文章


  前几天睡觉前接到前同事的一个信息,说有个奇怪的SQL问题,想让我帮忙看看,给点建议,我以为是一种非常复杂的SQL,他的反馈能让MySQL崩溃。 

我简单看了下,感觉不大可能啊,于是在自己的环境做了测试。

相关的SQL会关联两张表,我们就称为t10和t10_sub吧。

建表语句如下:

CREATE TABLE `t10` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `pid` varchar(10) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `t10_sub` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `pid` varchar(10) DEFAULT NULL,

  `cid` varchar(10) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

接下来我们直接进入正题,首先先来做一个查询,因为表里没有数据,所以查询的过程还是快的,显然是返回一个空集。

mysql> (select sub_tmp.cid, (select count(*) from t10 where pid = sub_tmp.pid ) as new_t10 from t10_sub as sub_tmp order by new_t10 + 1) union (select sub_tmp.id,sub_tmp.id from t10_sub as sub_tmp);

Empty set (0.00 sec)

而奇怪的是如果查看执行计划,则整条语句会导致当前会话崩溃。

mysql> explain (select sub_tmp.cid, (select count(*) from t10 where pid = sub_tmp.pid ) as new_t10 from t10_sub as sub_tmp order by new_t10 + 1) union (select sub_tmp.id,sub_tmp.id from t10_sub as sub_tmp);

ERROR 2013 (HY000): Lost connection to MySQL server during query

当然这个操作是可以复现,通过这个

写入1条数据

mysql> insert into t10(pid) values('test');

mysql> insert into t10_sub(pid,cid) values('test','test100');

数据也没什么特别之处,我们来继续执行查询。

mysql> (select sub_tmp.cid, (select count(*) from t10 where pid = sub_tmp.pid ) as new_t10 from t10_sub as sub_tmp order by new_t10 + 1) union (select sub_tmp.id,sub_tmp.id from t10_sub as sub_tmp);

ERROR 2013 (HY000): Lost connection to MySQL server during query

可以看到这次结果比较统一,执行计划解析和查询操作都会导致会话崩溃。

那目前有什么好的解决办法吗?

经过测试,目前有两种,一种是去除union的子句,一种是对于order by的部分做下调整,原来是order by new_t10+1,现在修改为order by new_t10.

mysql> explain (select sub_tmp.cid, (select count(*) from t10 where pid = sub_tmp.pid ) as new_t10 from t10_sub as sub_tmp order by new_t10 ) union (select sub_tmp.id,sub_tmp.id from t10_sub as sub_tmp);

+----+--------------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+

| id | select_type        | table      | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra           |

+----+--------------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+

|  1 | PRIMARY            | sub_tmp    | NULL       | ALL   | NULL          | NULL    | NULL    | NULL |    1 |   100.00 | NULL            |

|  2 | DEPENDENT SUBQUERY | t10        | NULL       | ALL   | NULL          | NULL    | NULL    | NULL |    1 |   100.00 | Using where     |

|  3 | UNION              | sub_tmp    | NULL       | index | NULL          | PRIMARY | 4       | NULL |    1 |   100.00 | Using index     |

| NULL | UNION RESULT       | <union1,3> | NULL       | ALL   | NULL          | NULL    | NULL    | NULL | NULL |     NULL | Using temporary |

+----+--------------------+------------+------------+-------+---------------+---------+---------+------+------+----------+-----------------+

4 rows in set, 2 warnings (0.00 sec)

当然在这里也是抛砖引玉,想看看大家有什么好的想法和调试办法。 

毫无疑问,这是一个bug.

640?

相关文章:

  • 你平时锻炼身体吗
  • 数据迁移流程的优化
  • MySQL复制问题的分析
  • 秦皇岛旅游归来
  • 《MySQL DBA工作笔记》前言
  • MySQL复制的奇怪问题跟进
  • MySQL高可用方案升级规划
  • 选择和努力
  • 无论是否“去O”,这些数据库选型与运维技巧你都该知道
  • MySQL周期表管理的设计
  • 推荐一些近期看过的电影和电视剧
  • 一个数据需求的讨论和分析
  • MySQL机房多活的初步设想
  • 《大江大河》观后感1
  • 基于中间件的负载均衡方案
  • __proto__ 和 prototype的关系
  • 30秒的PHP代码片段(1)数组 - Array
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Linux链接文件
  • SAP云平台里Global Account和Sub Account的关系
  • SQLServer之创建数据库快照
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 复杂数据处理
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 我看到的前端
  • 系统认识JavaScript正则表达式
  • 鱼骨图 - 如何绘制?
  • 在weex里面使用chart图表
  • hi-nginx-1.3.4编译安装
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • #{}和${}的区别是什么 -- java面试
  • #前后端分离# 头条发布系统
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)iOS字体
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET delegate 委托 、 Event 事件
  • .net中的Queue和Stack
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @Transaction注解失效的几种场景(附有示例代码)
  • @Transient注解
  • [100天算法】-x 的平方根(day 61)
  • [1181]linux两台服务器之间传输文件和文件夹
  • [20160807][系统设计的三次迭代]
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [BZOJ] 3262: 陌上花开
  • [C]整形提升(转载)
  • [CSS3备忘] transform animation 等