• Mysql 8.0.30 的查询包含自定义函数的表时,比8.0.27 慢了好几倍


    如题,这是我们今天发现的问题。两台一模一样的机器,OS和其他软件相同,运行同样的查询,A机40秒,B机180 秒。(估计值)非常奇怪,差别就剩下,A机安装的是 8.0.27 而B机装的是8.0.30. 为了检查是否是30 的问题,本人在虚拟机上将27 升级到30, 发现果然速度大幅下降,甚至出现了连接超时的错误。这样看来,30 版本有某种缺陷,但是具体是什么不得而知。为了将问题说清楚,将环境简单介绍一下。

    查询的业务数据库的记录数不到五万条,同时还要查询一个单位表,单位表里面记录了层级关系。因此为了查询方便,写了一个自定义函数,用以层级的查询。SQL语句,简化如下:

     SELECT 
           ...
            JSON_UNQUOTE(JSON_EXTRACT(F_PARENT_DEPT(`tp0`.`dept_id`),
                            '$[0].dep')) AS `dept_name1`,
            JSON_UNQUOTE(JSON_EXTRACT(F_PARENT_DEPT(`tp0`.`dept_id`),
                            '$[1].dep')) AS `dept_name2`,
            JSON_UNQUOTE(JSON_EXTRACT(F_PARENT_DEPT(`tp0`.`dept_id`),
                            '$[2].dep')) AS `dept_name3`,
            JSON_UNQUOTE(JSON_EXTRACT(F_PARENT_DEPT(`tp0`.`dept_id`),
                            '$[3].dep')) AS `dept_name4`,
            JSON_UNQUOTE(JSON_EXTRACT(F_PARENT_DEPT(`tp0`.`dept_id`),
                            '$[4].dep')) AS `dept_name5...
           
        FROM
            ((`IOT_FRONT_V1`.`sys_dept_railway` `tp0`
            JOIN `v_rcvdat_detail` `t2`)     )
        WHERE t2.dept_id=tp0.dept_id
          .....
    

    可以看出,速度慢的原因,是和两个表的笛卡尔积有关的, 如果该值很大,函数就会运行次数很多,从而影响速度。每个函数里面还有比较繁琐的查询操作,目的是查询到一个树形结果。但是问题是,抛弃代码质量的影响,为什么30 比27 慢了那么多呢?
    不知道有没有碰到类似问题的朋友,如果有,请留言交流一下。

    另外,本人更改了查询过程,建立了临时表,查询中不再使用内嵌的函数,速度已经提高了疫苗以内。

    是记备忘。
    maraSun BJFWDQ

  • 相关阅读:
    08_一句话让你人间清醒
    centos 通过rpm包安装mysql5.7
    1.docker安装
    国辰智企MES系统优化企业管理,让生产制造更高效
    原生HTML,CSS,JS实现tab栏切换效果
    Bert基础(十六)--Bert实战:中文文本分类任务-- transformers库实现
    自动驾驶感知算法实战2——车载相机及图像处理
    了解冒泡排序
    前端系统设计个人总结
    [go 面试] 分布式事务框架选择与实践
  • 原文地址:https://blog.csdn.net/Uman/article/details/126942749