MySQLでサブクエリがどうしても遅いときの対処法
他のRDBMSでも起こりますが、特にMySQLでは、サブクエリを使うとどうしても遅いときがあります。
そんなときの対処法は主に2点あります。
テンポラリーテーブルを使う方法
DROP TEMPORARY TABLE IF EXISTS tmp1; CREATE TEMPORARY TABLE tmp1 -- (PRIMARY KEY(id)) 必要に応じて主キー -- (INDEX(id)) インデックスを生成する AS SELECT * FROM customer; -- 使いたかったサブクエリ -- 遅かったクエリのサブクエリを tmp1 にして書き換える。 DROP TEMPORARY TABLE IF EXISTS tmp1;
文字列連結でSQLを生成する方法
例えば、以下のようなとき、col1のインデックスを使った方が早いときでも、ヒントを入れても使ってくれないことがある。
SELECT * FROM table1 WHERE col1 IN (SELECT colx FROM table2 WHERE xxx) ;
対処法
SELECT colx FROM table2 WHERE xxx ;
を先に実行し、結果から
SELECT * FROM table1 WHERE col1 IN (1, 3, 5) ;
SELECT * FROM table1 WHERE col1 IN ('JPN', 'USA') ;
などのSQL文を生成する。
配列が使えるDBでも、配列を使ったらインデックスを使わなかったり(古いバージョンの記憶なので現在はどうか?)するときにも有効です。