MySQL查询调优 - 为什么使用变量中的值比使用文字慢得多?

gb2*_*b2d 3 mysql database-tuning query-tuning

更新:我在下面自己回答了这个问题.

我正在尝试修复MySQL查询中的性能问题.我认为我所看到的是,将函数的结果赋给变量,然后运行带有与该变量进行比较的SELECT相对较慢.

但是,如果为了测试,我将比较替换为变量,并将其与我知道该函数将返回的字符串文字等效值(对于给定的场景)进行比较,然后查询运行得更快.

例如:

...

SET @metaphone_val := double_metaphone(p_parameter)); -- double metaphone is user defined

SELECT 

        SQL_CALC_FOUND_ROWS
        t.col1,
        t.col2, 
        ...

    FROM table t

            WHERE

            t.pre_set_metaphone_string = @metaphone_val -- OPTION A

            t.pre_set_metaphone_string = 'PRN' -- OPTION B (Literal function return value for a given name)
Run Code Online (Sandbox Code Playgroud)

如果我使用选项A中的行,则查询速度很慢.

如果我使用选项B中的行,那么查询速度很快,就像您期望的任何简单字符串比较一样.

为什么?

gb2*_*b2d 10

当答案打到我的时候写完了问题,所以无论如何要发布知识共享!

我意识到metaphone功能的返回值是UTF8.

与latin1字段的比较显然会导致相当大的性能开销.

我用以下代码替换了变量赋值:

SET @metaphone_val:= CONVERT(double_metaphone(p_parameter) USING latin1);
Run Code Online (Sandbox Code Playgroud)

现在查询运行速度和我预期的一样快.