2

以下のようなストアドプロシージャがあります

SELECT * 
FROM Table1
WHERE Tag IN (ids)

ここTagIntegerコラムがあります。

コンマ区切りの値を文字列としてストアド プロシージャに渡すのにうんざりしましたが、機能しません。次に、以下のようなストアドプロシージャを使用しました

SELECT * 
FROM Table1
WHERE FIND_IN_SET(Tag, ids) 

これは非常にうまく機能します。唯一の問題は、テーブルが非常に大きいことです。何百万もの行があり、FIND_IN_SET を使用すると、直接 SQL ステートメントを実行する場合に IN に比べて時間がかかりすぎます。

使用するのに最適なパフォーマンス最適化オプションは何ですか?

IDを整数に変換し、IN句の準備ができて解析できる分割関数はありますか? それが最良の選択肢になると思います。提案やアイデアはありますか?

4

1 に答える 1

4

ステートメントを準備してから実行できます。

set @sql = concat('select * from table1 where tag in (', ids, ')');

PREPARE q FROM @sql;

execute q;

これにより、実行ごとに文字列が構築されるため、in. 結果の execute は、 のインデックスを使用できるはずtagです。これにより、処理が大幅に高速化されます。

于 2013-07-14T17:18:52.540 に答える