如何在存储过程中优化这个MySQL查询?


SET @count := (SELECT count(*)
FROM dbo.ManyToManyTable SRSG
JOIN tableA SG on SRSG.a = SG.a
JOIN tableB SR on SRSG.b = SR.a
WHERE SR.c = INPUT_VALUE);
IF (@count > 0)
THEN
SELECT SG.fieldA, SG.fieldB
FROM dbo.ManyToManyTable SRSG
JOIN tableA SG on SRSG.a = SG.a
JOIN tableB SR on SRSG.b = SR.a
WHERE SR.c = INPUT_VALUE;
ELSE
SELECT SG.a, SG.b FROM dbo.tableA SG WHERE SG.b = "default value";
END IF;

这是一个MySQL数据库。这适用于我,但我不喜欢重复的选择查询。然而,我不知道如何在约束下修复它,这是逻辑在一个存储过程中。

您可以将其编写为单个查询:

with cte as (
SELECT SG.fieldA, SG.fieldB
FROM dbo.ManyToManyTable SRSG JOIN
tableA SG
on SRSG.salesGroupId = SG.salesGroupId JOIN
tableB SR 
on SRSG.salesRegionId = SR.salesRegionId
WHERE SR.AField = INPUT_VALUE
)
select *
from cte
union all
select SG.a, SG.b 
from dbo.tableA SG 
where SG.b = 'default value' and
not exists (select 1 from cte);

MySQL倾向于实现cte(总是?),所以这应该运行一次查询而不是两次。

一个快速但部分加速的方法是替换

SET @count = ( SELECT COUNT(*) ... );
IF (@count > 0)

with this(使用初始SELECT的剩余部分):

IF ( EXISTS ( SELECT 1 FROM ... ) )

同样为了性能考虑,一定要在SRSG:

PRIMARY KEY(a,b)
INDEX(b,a)

,不要使用AUTO_INCREMENT。

最新更新