6

更新: 以下でこれに答えました。

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 の行を使用すると、単純な文字列の比較が期待されるように、クエリが高速になります。

なんで?

4

1 に答える 1

14

答えが私に当たったときに質問を書き終えたので、とにかく知識を共有するために投稿してください!

metaphone関数の戻り値がUTF8であることに気付きました。

latin1 フィールドとの比較では、明らかにかなりのパフォーマンス オーバーヘッドが発生していました。

変数の割り当てを次のように置き換えました。

SET @metaphone_val:= CONVERT(double_metaphone(p_parameter) USING latin1);

これで、クエリは予想どおりの速さで実行されます。

于 2013-02-20T18:14:45.973 に答える