2015-07-03 53 views
0

我不知道如何优化一个有函数的查询。 具体来说,采取优化一个带有伪递归函数的查询mysql

select all_couples.*, 
     getCoauth(PersA, PersB, Prio_year) as PastCoauth 
from all_couples 

而且功能

CREATE DEFINER=`root`@`localhost` FUNCTION `getCoauth`(pA INT(11), pB INT(11), y YEAR(4)) RETURNS int(11) 
BEGIN 

RETURN (
select count(*) 
from all_couples as d 
where PersA=pA 
and PersB=pB 
and Prio_year < y 
); 

END 

我的工作表如下

Appln_id int(11) 
PersA int(11), index PersA 
PersB int(11), index PersB 
Prio_year year(4), index Year 

表有10.000.000行。生成选择需要一个多小时。如果我运行解释,我发现它没有使用查询中的键,但它在函数内正确执行。 我想知道是否问题在于,使用像我这样的函数,对于在主查询中选择的每一行,整个表上的选择都一样。

任何建议或参考优化这样的事情?

+0

这将为每个返回的行运行函数,并且从性能角度来看非常可怕。请结帐JOIN和GROUP BY – winmutt

+0

我试过了,但问题是,出于函数的原因,我不知道如何建模'Prio_year

回答

0
INDEX(PersA, PersB, Prio_year) 

即一个复合指数。从你有什么(3个单独的索引),它是不同。在你提供的示例代码中,它会工作得更好。

+0

请考虑编辑您的答案,以包含您的代码如何工作的解释。 – Matt