MySQL - 查询快但存储过程慢

标签 mysql stored-procedures query-performance

我知道这个问题已经被讨论了很多 here 。但我有一个特殊的情况,当我需要传递参数列表(逗号分隔)时,这会阻止我声明局部变量并将其用于输入参数。

正如上面的讨论所指出的,建议声明一个局部变量并将参数分配给该变量。但是,如果我的参数是 Text 类型并且可以是逗号分隔的列表,我该怎么办?

例如 -

CREATE DEFINER=`Admin`@`%` PROCEDURE `MyReport`(
    p_myparameter_HK Text
)
BEGIN
SELECT
*
FROM MyTable
WHERE 
(find_in_set(MyTable.column_HK, p_myparameter_HK) <> 0 OR MyTable.column_HK IS NULL)
;

END

性能:

Query

如果我只是运行查询 - 300 毫秒

Stored Procedure

CALL MyReport('0000_abcd_fake_000')

这个过程不断地运行。

我的问题是,如何禁用参数嗅探并使用局部变量而不是find_in_set来匹配查询性能。

最佳答案

有时我需要将任意列表传递给存储过程,我是这样做的:

  • CREATE(或已经拥有)一个用于传递信息的TABLE。调用者和过程都知道过程的名称。 (或者它可以被传入,但添加一些困惑的“准备执行”。)
  • 在该表中执行批量INSERT。 (INSERT INTO tbl (a,b) VALUES (...), (..), ...;)
  • 执行JOIN或其他有效使用表的操作。

就我而言,额外的努力是值得的。

关于MySQL - 查询快但存储过程慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56813119/

相关文章:

mysql - 在同一台服务器上测试 MySQL 恢复

mysql - MySQL 中的 DATE 类型比较

mysql - 在存储过程中的另一个 SELECT 中使用已返回的 SELECT

javascript - 提高 CSS3 动画的性能

mysql - 查询以获取不为空且不匹配字符串的最新构建说明

java - 软件中的“独立交易”是什么?

php - 验证输入和查询优化的问题

MySQL 存储过程返回空结果

java - 无法检索我希望使用存储过程选择的值

PostgreSQL 提高 PL/pgSQL 函数的性能