MySql在select和where中的计算相同

时间:2014-10-16 08:41:07

标签: mysql

我有一个看起来像这样的查询

SELECT 
  col1,
  col2 
FROM
  table1 t1 
  INNER JOIN table2 t2 
    ON t1.col = t2.col 
WHERE expensive_func () < 10 

这相当快地运行@ 0.110秒。但是,如果我还要显示expensive_func()的结果,请将查询更改为

SELECT 
  col1,
  col2,
  expensive_func() as col3
FROM
  table1 t1 
  INNER JOIN table2 t2 
    ON t1.col = t2.col 
WHERE expensive_func () < 10 

这样可行,但查询时间现在为~0.550

使用解释在两个查询的返回完全相同(由diff确认)

有没有办法重新使用昂贵的功能?

我认为它较慢,因为它必须存储昂贵的func的结果?因为它的速度超过两倍(我希望是最大值)

编辑:

以防万一我的版本是5.5.37-0ubuntu0.12.04.1-log。

EDIT2:

从WHERE中删除expensive_func()似乎没有在时间方面对第二个查询产生影响,它返回的行数相同但时间相同。

EDIT3:

由于某种原因,使用mysql CREATE FUNCTION会降低它的速度,将代码从函数中取出并将其放入查询中会使速度更快。

1 个答案:

答案 0 :(得分:0)

expensive_func是一个存储函数。将存储的函数替换为存储函数的内容使查询在~0.080秒内运行。一个巨大的进步。

我不确定为什么存储的函数使一切变得更慢但似乎唯一的缺点是稍微不那么可维护的MySQL代码。