mysql - 优化mysql if elseif和else逻辑
问题描述
这部分 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;
如果我将代码更改为以下,它会返回相同的结果吗?
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;
它会提高性能吗?
如果我将“如果不存在”的逻辑更改为“select 1 into some_var”之类的逻辑会更快吗?
解决方案
“如果不存在”行可能是罪魁祸首,它必须检查整个表以确保每条记录不符合您的标准。确保 where 子句(regid、QID 和 TestId)中的每一列都有索引。这应该允许数据库引擎更快地过滤掉不匹配的记录。或者您可以考虑尝试重构,以便仅在单个索引字段上进行搜索。
推荐阅读
- html - 如何显示在从 SQL Server 检索的网格中转换的十六进制颜色
- android - 如何使用 Kotlin dev Android 获取我的位置?
- batch-file - BATCH:在替换另一个变量的一部分的变量中时转义“=”符号
- python - 如何从 Python 关闭 MT5 订单?
- c++ - 读取文件并使用 toupper
- javascript - 获取双引号之间的字符串,同时将文本保持在中间
- javascript - 如何在 Selenium 中使用 XPath 查找并单击下拉元素?
- excel - 根据部分文件名打开多个 Excel 文件
- openshift - 如何使用 .kubeconfig 文件访问 Openshift 集群
- apache - Ubuntu 18 将两个域指向同一个文件夹