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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值