优化mysql if elseif和else逻辑
MySQL存储过程的这一部分工作正常,但速度非常慢。有没有办法优化它优化mysql if elseif和else逻辑,mysql,stored-procedures,Mysql,Stored Procedures,MySQL存储过程的这一部分工作正常,但速度非常慢。有没有办法优化它 IF (p_regid >0 AND p_submittedqueId>0 AND p_saveresponse=True) then if not exists(select * from responseok where regid=p_regid AND QID =p_submittedqueId and TestId=p_TestId) AND (p_COption!='' or p
IF (p_regid >0 AND p_submittedqueId>0 AND p_saveresponse=True) then
if not exists(select * from responseok where regid=p_regid AND QID =p_submittedqueId and TestId=p_TestId) AND (p_COption!='' or p_responsetext!='') then
insert into responseok (regid,TestId,QID,Response,ResponseText,timestamp)
select p_regid,p_testId,p_submittedqueId,p_COption,p_responsetext,now(3);
elseif (p_responsetext ='' AND p_COption='') then
insert into responsehistory (regid,TestId,QID,timestamp)
select p_regid,p_testId,p_submittedqueId,now(3);
delete from responseok where regid =p_regid and QID =p_submittedQueId AND TestId=p_TestId;
else
insert into responsehistory (regid,TestId,QID,timestamp)
select p_regid,p_testId,p_submittedqueId,now(3);
delete from responseok where regid =p_regid and QID =p_submittedQueId AND TestId=p_TestId;
insert into responseok (regid,TestId,QID,Response,ResponseText,timestamp)
select p_regid,p_testId,p_submittedqueId,p_COption,p_responsetext,now(3);
end if;
end if;
如果我将代码更改为following,它会返回相同的结果吗
IF (p_regid >0 AND p_submittedqueId>0 AND p_saveresponse=True AND p_COption!='' or p_responsetext!='') then
if not exists(select * from responseok where regid=p_regid AND QID =p_submittedqueId and TestId=p_TestId) then
insert into responseok (regid,TestId,QID,Response,ResponseText,timestamp)
select p_regid,p_testId,p_submittedqueId,p_COption,p_responsetext,now(3);
else
insert into responsehistory (regid,TestId,QID,timestamp)
select p_regid,p_testId,p_submittedqueId,now(3);
delete from responseok where regid =p_regid and QID =p_submittedQueId AND TestId=p_TestId;
end if;
else
insert into responsehistory (regid,TestId,QID,timestamp)
select p_regid,p_testId,p_submittedqueId,now(3);
delete from responseok where regid =p_regid and QID =p_submittedQueId AND TestId=p_TestId;
insert into responseok (regid,TestId,QID,Response,ResponseText,timestamp)
select p_regid,p_testId,p_submittedqueId,p_COption,p_responsetext,now(3);
end if;
它会提高性能吗
如果我将逻辑“if not exists”更改为“select 1 into some_var”会更快吗?如果“if not exists”行很可能是罪魁祸首,它必须检查整个表以确保每个记录都不符合您的条件。确保where子句(regid、QID和TestId)中的每一列都有索引。这应该允许DB引擎更快地过滤掉不匹配的记录。或者您可以考虑尝试重构,以便只对单个索引字段进行搜索。 “如果不存在”行可能是罪魁祸首,它必须检查整个表以确保每个记录与您的条件不匹配。确保where子句(regid、QID和TestId)中的每一列都有索引。这应该允许DB引擎更快地过滤掉不匹配的记录。或者您可以考虑尝试重构,以便只对单个索引字段进行搜索。您是否知道ReiSoCo表中的ReGID、QID和StID列中有索引?您知道ReSeCoOK表中的ReGID、QID和StID列是否有索引吗?@包含SeRIDID的ShanTANO-A“覆盖索引”,QID和TestID对你最有利。此url可能有助于理解-@shantanuo包含regid、QID和TestID的“覆盖索引”将符合您的最佳利益。此url可能有助于理解-