我一直在试图弄清楚我有一系列查询出了什么问题,而现在我只是感到困惑。MySQL查询在直接运行时速度很快,但在以存储过程运行时速度很慢
它应该在一个存储过程中被GUI应用程序调用。
有使用SELECT
与子查询,终于另一UPDATE
只有一个“微小”的问题,它的第一个简单的UPDATE
,那么INSERT
。手工一起运行这些查询,总共执行时间为0.057秒,不算太破旧。
现在,我尝试创建一个带有这些查询的存储过程以及五个输入变量,我运行此过程,并在第一次尝试时花费了47.096秒,随后调用它显示类似的执行时间(35到50秒)。从MySQL工作台运行单个查询仍然显示小于0.1s的执行时间
实际上这些查询没有什么奇特的东西,那么为什么存储过程需要永久执行,而查询本身只能执行几分之一秒?是否有某种我在此错过的MySQL特性?
进一步的测试结果:
看来,如果我跑在MySQL Workbench中的查询,但使用变量,而不是仅仅把变量的值在查询运行就像存储过程一样慢。所以我试着改变存储过程来使用静态值而不是变量,并且突然快速地运行。显然,由于某种原因,使用变量会使其运行速度非常慢(例如,当我在查询中直接使用变量值时,第一个UPDATE
查询从三个变量的约0.98s变为0.04-0.05s,无论它是在存储过程中或直接运行查询)。
所以,问题不在于存储过程,它与我使用变量有关(这是不可避免的)。
我们需要看到一些代码。在声明/处理变量时,第一个疯狂的猜测会是奇怪的事情......但是,如果没有看到一些代码,这是一个完全*狂野的猜测。 –
正如我所说的,非常简单的查询运行真的很快,只是'UPDATE表SET列=变量WHERE othercolumn> = othervariable或othercolumn = yetanothervar'类型的东西。并且这些变量在常规的'IN varname COLUMNTYPE(SIZE)'表单中声明为存储过程的参数。令我感到困惑的是,没有什么奇怪或缓慢的(是的,我避免显示代码,因为我的老板可能会因为我这样做而感到不安)。 – mludd
我可以提到删除除UPDATE之外的所有查询(本身运行时间小于0.05s,然后运行存储过程仍然会给出1s左右的执行时间,上面的注释很简单地描述了复杂的是'UPDATE'是... – mludd