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的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mysql 的 UDF 中创建两个循环

加速超时的 MySQL 查询

如何将 .so 文件发送到 Google Cloud 上的 MySQL 实例?

如何获取当前在我的 MySQL 服务器上运行的所有查询的完整列表? [复制]

udf 加速

从我的 LINQ to SQL 中调用 UDF 和 sproc 的效率如何?