两个语句返回两个不同结果时的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 yourtablenameexplain select ...rest of your query 的输出(作为文本,而不是图像) 【参考方案1】:

简短回答:不。我们需要查看每个 Select。

长答案:

两个独立的SELECTs 不会通过Stored Proc、VIEWUNION 等运行得更快。

一些例外:

一个 SQL 的存储过程:可能是零差异。

两个 SQL 的存储过程:如果服务器远离客户端,减少发送到服务器的 SQL 数量可以节省网络延迟时间。 (跨大西洋时间大约为 0.1 秒,所以这可能不是您所看到的“慢”。)

VIEWs 主要是语法糖,所以在任何情况下都不太可能有帮助。

UNION可能需要生成一个临时表,这可能会有点慢。在最新的 mysql UNION ALL 中避免使用临时表,并且没有外部分组或排序。

【讨论】:

以上是关于两个语句返回两个不同结果时的MYSQL存储过程优化的主要内容,如果未能解决你的问题,请参考以下文章

mysql存储过程 把SQL语句返回结果赋给一个变量,该SQL语句返回的结果不止一条,该怎么写,新手,求指教!

Mysql大数据量分页优化

Hibernate 调用存储过程 该语句没有返回结果集

MySQL数据库(31):存储过程 procedure

mysql 创建存储过程问题

MYSQL,使用单个选择语句在存储过程中设置两个变量