更新:我自己在下面回答了这个问题
我正在尝试修复MySQL查询中的一个性能问题。我认为我看到的是,将函数的结果分配给变量,然后运行SELECT并与该变量进行比较相对较慢。
然而,如果为了测试起见,我将变量的compare替换为与字符串的compare,相当于我所知道的函数将返回的值(对于给定的场景),那么查询运行得更快。
例如:
...
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)
如果使用选项A中的行,则查询速度较慢。
如果我使用选项B中的行,那么查询的速度就像你所期望的任何简单字符串比较一样快
为什么?
当我得到答案时,我已经写完了这个问题,所以还是发帖分享知识吧!
我意识到变音函数的返回值是UTF8。
与latin1字段相比,显然会产生相当大的性能开销。
我将变量赋值替换为:
SET @metaphone_val:= CONVERT(double_metaphone(p_parameter) USING latin1);
现在,查询的运行速度与我预期的一样快。