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