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

简介: 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

            </div>
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
关系型数据库 MySQL 数据库
【Mac os系统】安装MySQL数据库
本文详细介绍了在Mac OS系统上安装MySQL数据库的步骤,包括下载、安装、配置环境变量、启动服务、授权设置以及解决常见问题,并提供了一些常用的MySQL命令。
1333 0
【Mac os系统】安装MySQL数据库
|
消息中间件 缓存 调度
常见的8种数据结构
常见的数据结构包括数组、链表、队列、栈、树、堆、哈希表和图。
394 5
|
SQL XML Java
ruoyi若依框架@DataScope注解使用以及碰到的一些问题
ruoyi若依框架@DataScope注解使用以及碰到的一些问题
4966 0
|
人工智能 搜索推荐
AI助力,短剧发展引来新的创新热潮
当前AIGC在短剧视频领域的应用尚不突出,但在文本和图像创作上已表现出色,各大厂商提供了多种体验良好的文生文、文生图服务。AI技术正快速改变短剧创作,从智能编剧到场景自动生成,极大提升了创作效率和内容多样性,预示着短剧领域的创新热潮。未来,短剧的创意将更多依赖于提供的文本提示词的创意性和准确性。
|
缓存 前端开发 安全
前端开发者必备:HTTP状态码含义与用途解析,常见错误码产生原因及解决策略
前端开发者必备:HTTP状态码含义与用途解析,常见错误码产生原因及解决策略
2017 0
|
Prometheus 监控 Cloud Native
Prometheus 查询语言(PromQL):深入解析
【8月更文第29天】Prometheus 是一款开源的监控系统和时间序列数据库,广泛应用于各种系统的监控和告警。PromQL(Prometheus Query Language)是 Prometheus 用来查询和聚合时间序列数据的一种强大语言。本文将详细介绍 PromQL 的功能和语法,包括基本查询、向量操作、聚合函数等,并提供具体的代码示例。
1826 2
|
运维 监控 安全
构建高效自动化运维体系的五大支柱
【5月更文挑战第17天】 在当今IT基础设施管理领域,自动化不再是一个选择而是一个必然。本文将探讨构建高效自动化运维体系的核心要素,包括监控、配置管理、持续集成/持续部署(CI/CD)、故障响应以及安全策略的整合。通过深入分析这些关键组成部分,我们将揭示如何实现系统的稳定性、效率和安全性,同时减少人为错误并提升团队的响应能力。
|
消息中间件 NoSQL 算法
基于SpringBoot + MyBatis + Caffeine + Redis + MySql + Kafka实现一个论坛网站 附完整代码
基于SpringBoot + MyBatis + Caffeine + Redis + MySql + Kafka实现一个论坛网站 附完整代码
618 0
基于SpringBoot + MyBatis + Caffeine + Redis + MySql + Kafka实现一个论坛网站 附完整代码
|
弹性计算 开发框架 负载均衡
服务网格下的东西向与南北向流量管理实践(二)|学习笔记
快速学习服务网格下的东西向与南北向流量管理实践(二)
1590 0
服务网格下的东西向与南北向流量管理实践(二)|学习笔记