Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化mysql if elseif和else逻辑_Mysql_Stored Procedures - Fatal编程技术网

优化mysql if elseif和else逻辑

优化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

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_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可能有助于理解-