两个语句返回两个不同结果时的MYSQL存储过程优化
Posted
技术标签:
【中文标题】两个语句返回两个不同结果时的MYSQL存储过程优化【英文标题】:MYSQL stored procedure optimization when two statements returns two different results 【发布时间】:2021-09-19 17:23:47 【问题描述】:我的 API 正在调用两个 sql 语句,返回两个不同的输出
mycursor.execute("SELECT a,b,c,d,e,f,g,h,i,j,k \\
from table_1 \\
left join table_2 \\
left join table_3 \\
left join table_4 \\
left join table_5 \\
")
myresult = mycursor.fetchall()
mycursor.execute("SELECT r,s,t,u,v,w,x,y,z \\
from table_6 \\
left join table_8 \\
left join table_9\\
left join table_10\\
left join table_11 \\
")
myresult = mycursor.fetchall()
两个选择查询都花费了很多时间来执行
所以,我打算将这两个查询转换为两个不同的存储过程
DROP PROCEDURE IF EXISTS statement_1;
DELIMITER //
CREATE PROCEDURE statement_1
BEGIN
SELECT a,b,c,d,e,f,g,h,i,j,k
from table_1
left join table_2
left join table_3
left join table_4
left join table_5
END //
DELIMITER ;
DROP PROCEDURE IF EXISTS statement_2;
DELIMITER //
CREATE PROCEDURE statement_2
BEGIN
SELECT r,s,t,u,v,w,x,y,z
from table_6
left join table_8
left join table_9
left join table_10
left join table_11
END //
DELIMITER ;
打电话给他们
myresult.callproc('statement_1')
myresult.callproc('statement_2')
这种方法会更快,还是我需要使用UNION ALL
将这两个语句组合成一个存储过程?
这是否可能,假设这两个语句返回完全不同且不相关的输出。
【问题讨论】:
您可能只需要join
键上的索引。或者您的数据可能很大,任何查询都需要很长时间才能返回您想要的结果。
将查询移动到存储过程将无济于事。使用联合无济于事。我建议您提出一个新问题以帮助优化您的查询,显示所有表的 show create table yourtablename
和 explain select ...rest of your query
的输出(作为文本,而不是图像)
【参考方案1】:
简短回答:不。我们需要查看每个 Select。
长答案:
两个独立的SELECTs
不会通过Stored Proc、VIEW
、UNION
等运行得更快。
一些例外:
一个 SQL 的存储过程:可能是零差异。
两个 SQL 的存储过程:如果服务器远离客户端,减少发送到服务器的 SQL 数量可以节省网络延迟时间。 (跨大西洋时间大约为 0.1 秒,所以这可能不是您所看到的“慢”。)
VIEWs
主要是语法糖,所以在任何情况下都不太可能有帮助。
UNION
可能需要生成一个临时表,这可能会有点慢。在最新的 mysql UNION ALL
中避免使用临时表,并且没有外部分组或排序。
【讨论】:
以上是关于两个语句返回两个不同结果时的MYSQL存储过程优化的主要内容,如果未能解决你的问题,请参考以下文章