更新: 以下でこれに答えました。
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)
オプション A の行を使用すると、クエリが遅くなります。
オプション B の行を使用すると、単純な文字列の比較が期待されるように、クエリが高速になります。
なんで?