MySQL - 查询速度快但存储过程速度慢

MySQL - Fast query but slow Stored Procedures

我知道这个问题已经被讨论了很多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')

这个程序不停地运行ning。

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

我需要将任意事物列表传递给存储过程的次数,我是这样做的:

  • CREATE(或已经有)一个 TABLE 用于传递信息。调用者和过程都知道过程的名称。 (或者也可以传进来,但是会增加一些杂乱"prepare-executes"。)
  • 对 table 做大量 INSERT。 (INSERT INTO tbl (a,b) VALUES (...), (..), ...;)
  • 执行 JOINs 或任何有效使用 table 的操作。

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