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

时间:2019-06-28 20:55:09

标签: 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

性能:

  

查询

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

  

存储过程

CALL MyReport('0000_abcd_fake_000')

此过程不断运行。

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

1 个答案:

答案 0 :(得分:1)

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

  • CREATE(或已经有一个)TABLE用于传递信息。调用方和过程都知道过程的名称。 (或者可以传入,但是添加一些混乱的“准备执行”。)
  • 在该表中进行批量INSERT。 (INSERT INTO tbl (a,b) VALUES (...), (..), ...;
  • 执行JOINs或有效地使用表格的任何操作。

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