[table01]
table01_id│field
────┼───
1 │テキスト
2 │テキスト
[table02]
table02_id│table01_id│field_id
────┼────┼──
1 │1 │1
2 │1 │2
3 │2 │2
4 │1 │4
5 │2 │3
6 │1 │5
この様な感じのテーブルで、table01とtable02は、table01_idでCASCADEしています。
(本当は、もっとイッパイCASCADEしてて、複雑ですが、とりあえず)
SELECT `table01`.`table01_id`
FROM table01
WHERE `table01`.`field` <> ''
IN (
SELECT `table02`.`table01_id`
FROM table02
WHERE `table02`.`field_id` = '1'
OR `table02`.`field_id` = '4'
OR `table02`.`field_id` = '5'
GROUP BY `table02`.`table01_id`
HAVING COUNT( `table02`.`table01_id` ) =3
)
GROUP BY `table01`.`table01_id`;
というSQLを実行したいのですが、サブクエリを使っているせいか、
異様に遅いのです。
JOINでなんとか、これを実現できませんか?
-----
↓これは違いますもんね。。。
SELECT `table01`.`table01_id`
FROM table01
LEFT JOIN `table02` ON `table01`.`table01_id` = `table02`.`table01_id`
WHERE `table01`.`field` <> ''
AND (
`table02`.`field_id` = '1'
AND `table02`.`field_id` = '4'
AND `table02`.`field_id` = '5'
)
GROUP BY `table01`.`table01_id`;
未確認ですが、こちらでどうでしょうか
SELECT TBL1.`table01_id` FROM table01 AS TBL1 INNER JOIN ( SELECT `table01_id` FROM table02 WHERE `field_id` IN ('1','4','5') GROUP BY `table01_id` HAVING COUNT( `table01_id` ) =3 ) AS TBL2 ON TBL1.`table01_id` = TBL2.`table01_id`
もっと複雑ということなので具体的には、EXPLAIN の結果を見てということになりますが、
とりあえず、インデックスを利用できるようであれば、それなりに高速になりますので、
例えば table02 の table01_id にインデックスを付けてあるかなどを確認してみてください。
(JOINに変更してもインデックスが適正でないと、あまり高速化は見込めません)
IN ではなく EXISTS のほうが高速になる場合もありますので検討にいれてみてください。
EXISTS( SELECT * FROM `table02` T2 WHERE T2.`table01_id` = `table01`.`table01_id` AND T2.`field_id` IN('1', '4', '5') GROUP BY T2.`table01_id` HAVING COUNT(*) =3 )
※テーブル名はエイリアス(別名)をつけるほうが見やすくなりますし、
メンテナンスも楽になりますのでお勧めします。
ありがとうございます。
> インデックス
これは、CASCADEしてるので、自動的に付いているような気もしますが、明示的にもつけてみました。
でも、やっぱり、変化はありませんでした。
> EXISTS
おお!これは、試してみます!
-----
少し速度が上がりました。
未確認ですが、こちらでどうでしょうか
SELECT TBL1.`table01_id` FROM table01 AS TBL1 INNER JOIN ( SELECT `table01_id` FROM table02 WHERE `field_id` IN ('1','4','5') GROUP BY `table01_id` HAVING COUNT( `table01_id` ) =3 ) AS TBL2 ON TBL1.`table01_id` = TBL2.`table01_id`
おお!
JOIN版ですね。
試してみます。
ありがとうございます。
-----
かなり速度が上がりました。
30秒→0.8秒
ありがとうございました。
おお!
JOIN版ですね。
試してみます。
ありがとうございます。
-----
かなり速度が上がりました。
30秒→0.8秒
ありがとうございました。