MySQL如何在我的查询中加速UDF
Posted
技术标签:
【中文标题】MySQL如何在我的查询中加速UDF【英文标题】:MySQL how can I speed up UDF in my query 【发布时间】:2014-04-16 02:15:20 【问题描述】:我有一张表,其中包含用户 ID、部门、呃。我创建了一个简单的查询来收集所有这些信息。
SELECT table.userID, table.department, table.er FROM table;
现在,我想将属于同一部门的所有 er 分组并执行此计算
select sum(table.er)/3 as department_er from table group by table.department;
然后将此结果作为新列添加到我的第一个查询中。为此,我创建了一个如下所示的 UDF
BEGIN
DECLARE department_er FLOAT;
set department_er = (select sum(er) from table where table.department = dpt);
RETURN department_er;
END
然后我在这个查询中使用了那个 UDF
SELECT table.userID, table.department, (select dptER(table.department)/3) as department_er FROM table
我已经为我的表编制了索引,更复杂的查询从 4 多分钟缩短到了不到 1 秒。这似乎很简单,但要运行 10 分钟。有没有更好的方法来做到这一点或优化我的 UDF?
原谅我的n00b-ness :)
【问题讨论】:
这也有效,但需要相当长的时间:select table.userID, table.department as dpt, (select (sum(table.er)/3) where table.department = dpt) as department_er从表中; 【参考方案1】:在 SELECT 子句中尝试一个没有依赖聚合子查询的查询:
select table.userID,
table.department as dpt,
x.department_er
from table
join (
select department,
(sum(table.er)/3) As department_er
from table
group by department
) x
ON x.department = table.department
无法优化此 UDF 函数。也许它似乎适用于简单的查询,但通常它会损害您的数据库性能。 想象一下,我们有这样一个查询:
SELECT ....., UDF( some parameters )
FROM table
....
mysql 必须为此查询中从表中检索到的每条记录调用此函数 如果表包含 1000 条记录 - 该函数被触发 1000 次。 并且函数内的查询也被触发了 1000 次。 如果有 10.000 条记录 - 则该函数被调用 10.000 次。 即使您以这种方式优化此函数,UDF 将快 2 倍,上述查询仍将触发该函数 1000 次。 如果 500 个用户有相同的部门 - 它仍然会为每个用户调用 500 次,并为每个用户计算 相同的值。 499 次冗余调用,因为只需要 1 次调用即可计算此值。 优化此类查询的唯一方法是将“内部”查询从 UDF 函数中取出,并使用连接等将其与主查询结合起来。
【讨论】:
以上是关于MySQL如何在我的查询中加速UDF的主要内容,如果未能解决你的问题,请参考以下文章
如何将 .so 文件发送到 Google Cloud 上的 MySQL 实例?