我在mysql中有以下功能
CREATE FUNCTION `get_project_uuid`(project_kee varchar(400)) RETURNS varchar(50) CHARSET utf8
BEGIN
declare v_project_uuid varchar(50);
select project_uuid into v_project_uuid from projects where scope='PRJ' and kee=project_kee;
RETURN v_project_uuid;
END
当我直接从mysql命令提示符运行此函数时,它会在几毫秒内运行,但是当我在另一个select语句中使用此函数时,执行该hosing select语句大约需要2-3分钟。
select * from issues where project_uuid = get_project_uuid('Project1')
但是当我从函数中获取select语句并直接在托管select语句而不是函数调用中使用它时,它在几毫秒内工作。
select * from issues where project_uuid = (
select project_uuid from projects
where scope='PRJ' and kee='Project1'
)
使用该功能需要更长的时间似乎很不寻常。现在由于时间较长,我不得不使用该功能。我错过了什么吗?
答案 0 :(得分:1)
当您从命令行调用get_project_uuid()函数时,它只调用一次,因此运行得更快。
当你在select语句中使用这个函数时(即你问题的第二个代码段),根据你的语句,可能会为在问题表中的每一行调用此函数。外部选择声明。现在,如果问题表有很多行,则可能需要更长的时间才能执行。
最后,在第3个代码块的情况下,它可以更快,因为mysql不会为问题表的每一行运行内部select语句。这是通过使用内部select语句中的相同值来完成优化的一部分。
如果您想使用该功能并且仍然希望它更快,您可以将该功能声明为 deterministic 。在给定相同输入的情况下始终生成相同输出的函数可以声明为确定性的。现在你必须决定是否适用于你的情况。如果您错误地将非确定性函数声明为确定性,则Mysql不会抱怨。但是这样做会让你得到错误的结果。