如题,这是我们今天发现的问题。两台一模一样的机器,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