人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【MySQL 4.1.xでサブクエリが遅い】

[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`;

●質問者: PEPOTA
●カテゴリ:コンピュータ
✍キーワード:Cascade FIELD GROUP MySQL ON
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● kn1967
●20ポイント

もっと複雑ということなので具体的には、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

おお!これは、試してみます!

-----

少し速度が上がりました。


2 ● HALSPECIAL
●60ポイント ベストアンサー

未確認ですが、こちらでどうでしょうか


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秒

ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ