MySQL 8.0.23上遇到一个FIND_IN_SET的BUG(一)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDSClaw,2核4GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: MySQL 8.0.23上遇到一个FIND_IN_SET的BUG(一)

1、背景

在MySQL 8.0.23出现执行SQL超时的报错,而在MySQL8.0.18版本上未出现,故做个记录,以飨读者。

2、故障提要

在客户MySQL版本8.0.23,在部署客户测试环境时出现SQL执行超时报错。通过慢日志查询,找到对应的SQL。SQL如下:

SELECT * FROM t_dict WHERE FIND_IN_SET(id,(SELECT getDictChildrenNew(
        (select id from t_dict where code = 'metadata_classify'
     and root_code = 'metadata_classify' ),
        (select code from t_dict where code = 'metadata_classify'
     and root_code = 'metadata_classify' ),
        (select root_code from t_dict where code = 'metadata_classify'
     and root_code = 'metadata_classify' )
        )))
        order by dict_level,dict_order asc;




这个SQL用到了一个自定义函数getDictChildrenNew。函数内容如下:(真实的账号使用user_name代替了,已脱敏)

CREATE DEFINER=`user_name`@`%` FUNCTION `user_name`.`getDictChildrenNew`(iid varchar(255),icode varchar(255),ircode varchar(255)) RETURNS varchar(5000) CHARSET utf8mb4
    READS SQL DATA
BEGIN
DECLARE oTemp VARCHAR(5000);
DECLARE oTempChild VARCHAR(5000);
DECLARE oTempId VARCHAR(5000);
DECLARE oRootCode VARCHAR(5000);
SET oTemp = '';
SET oTempChild = icode;
SET oTempId = iid;
SET oRootCode = ircode;
WHILE oTempChild IS NOT NULL
DO
SET oTemp = CONCAT(oTemp,',',oTempId);
SELECT GROUP_CONCAT(ID) INTO oTempId
FROM t_dict
WHERE ROOT_CODE = oRootCode AND  FIND_IN_SET(PARENT_CODE,oTempChild);
SELECT GROUP_CONCAT(CODE) INTO oTempChild
FROM t_dict
WHERE ROOT_CODE = oRootCode AND FIND_IN_SET(PARENT_CODE,oTempChild);
END WHILE;
RETURN oTemp;
END

3、测试现象

我单独将where子句中这部分单独执行只需要122ms

SELECT getDictChildrenNew(
        (select id from t_dict where code = 'metadata_classify' #58
     and root_code = 'metadata_classify' ),
        (select code from t_dict where code = 'metadata_classify' #metadata_classify
     and root_code = 'metadata_classify' ),
        (select root_code from t_dict where code = 'metadata_classify' #metadata_classify
     and root_code = 'metadata_classify' )
        )

屏幕快照 2021-11-19 下午3.16.48.png

或者我单独将这个查询的值以字符串形式作为FIND_IN_SET的第二个参数传入执行也很快。仅需79ms。

屏幕快照 2021-11-19 下午3.17.44.png

而我单独执行上面完整的SQL就会出现超时报错:(这为了演示,我就没有等到报错再截图了)

屏幕快照 2021-11-19 下午3.18.17.png

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
SQL 关系型数据库 MySQL
【YashanDB知识库】MySQL的FIND_IN_SET如何在YashanDB改写
本文来自YashanDB官网,探讨了MySQL中使用`FIND_IN_SET`函数在YashanDB中不兼容的问题及解决方法。由于YashanDB的`tinyint`类型无法参与条件运算,而MySQL的Boolean类型是`tinyint`的同义词,导致直接迁移时出现错误。文章通过分析原因,提出改写方案:将`where find_in_set(`替换为`where 0 < find_in_set(`,从而实现兼容性调整,方便用户快速迁移和改写SQL语句。
|
存储 关系型数据库 MySQL
MySQL中利用FIND_IN_SET进行包含查询的技巧
`FIND_IN_SET`提供了一种简便的方法来执行包含查询,尤其是当数据以逗号分隔的字符串形式存储时。虽然这个方法的性能可能不如使用专门的关系表,但在某些场景下,它提供了快速简便的解决方案。开发者应该根据具体的应用场景和性能要求,权衡其使用。
633 0
|
SQL 关系型数据库 MySQL
(十八)MySQL排查篇:该如何定位并解决线上突发的Bug与疑难杂症?
前面《MySQL优化篇》、《SQL优化篇》两章中,聊到了关于数据库性能优化的话题,而本文则再来聊一聊关于MySQL线上排查方面的话题。线上排查、性能优化等内容是面试过程中的“常客”,而对于线上遇到的“疑难杂症”,需要通过理性的思维去分析问题、排查问题、定位问题,最后再着手解决问题,同时,如果解决掉所遇到的问题或瓶颈后,也可以在能力范围之内尝试最优解以及适当考虑拓展性。
1471 3
|
存储 关系型数据库 MySQL
【Elasticsearch】在es中实现mysql中的FIND_IN_SET查询条件
【Elasticsearch】在es中实现mysql中的FIND_IN_SET查询条件
414 0
|
SQL 关系型数据库 MySQL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
2526 0
|
存储 SQL 关系型数据库
MySQL 中character_set_server 和collation_server
在MySQL中,`character_set_server` 和 `collation_server` 是两个重要的系统变量,它们分别用于定义服务器级别的字符集和排序规则。 1. **character_set_server**: * 这个变量定义了MySQL服务器使用的默认字符集。字符集是一组字符的编码方式,它决定了如何在数据库中存储和检索字符数据。 * 例如,`utf8` 是一个常用的字符集,它支持大部分Unicode字符,包括中文、英文、阿拉伯文等。 * 你可以通过以下SQL命令查看当前的 `character_set_server` 设置: ``` sql`SHOW V
2030 1
|
7月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
7月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
7月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1233 152

推荐镜像

更多
下一篇
开通oss服务