SQLer 生島勘富 のブログ

RDB・SQLの話題を中心に情報発信をしています。

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でも、配列を使ったらインデックスを使わなかったり(古いバージョンの記憶なので現在はどうか?)するときにも有効です。