2

このクエリが完了するまでに 10 秒かかります。しかし、手動でサブクエリを実行し、t1.idそのリストへの制限を変更すると、0.00 秒で完了します。MySQL がクエリをより速く実行できるようにするにはどうすればよいですか?

SELECT t1.col1, t2.col2, t3.col3
FROM t1, t2, t3
WHERE  t1.t2id = t2.id AND t1.t3id = t3.id
AND t1.id IN ( SELECT id FROM t4 WHERE blah = 123 )

また、なぜこれが起こっているのですか?t1.id でフィルタリングする前に、MySQL が何らかの方法で 3 つのテーブルすべてを結合するとします。

t1、t2、および t3 には、それぞれ 3000、15、および 80 行が含まれます。サブクエリは 2 ~ 10 行を返します。

4

3 に答える 3

2

try to use the "INNER JOIN" rather than "IN" function. This way your sql instruction will be more performative.

SELECT t1.col1, t2.col2, t3.col3
FROM ((t1 INNER JOIN t2 ON t1.t2id = t2.id) INNER JOIN t3 ON t1.t3id = t3.id) INNER JOIN t4 ON t1.id = t4.id
WHERE t4.blah = 123
于 2012-08-17T11:53:07.723 に答える
1

ステートメントを実行EXPLAINすると、MySql がディスク上に一時テーブルを作成したことがわかる場合があります。これは、インライン選択 (IN用語) 内のデータが十分に大きい場合によく発生します。

手短に:

a)EXPLAINデータベースで何が起こっているかを確認するために使用します(そして、データが増加するとこの動作がどのように変化するかを確認します)

b) 可能であればインライン サブクエリを避ける

c) MySql にはネストされたループ結合アルゴリズムしかないことを覚えておいてください (他の DB もハッシュ結合アルゴリズムとマージ結合アルゴリズムを使用します)。あなたは転換点に達します。

于 2012-08-17T12:04:53.123 に答える
1

Rewrite the query without subquery:

SELECT t1.col1, t2.col2, t3.col3
FROM t1, t2, t3, (SELECT id FROM t4 WHERE blah = 123) AS t4
WHERE  t1.t2id = t2.id AND t1.t3id = t3.id
AND t1.id=t4.id

Be sure you have indexes on the fields used in the WHERE clauses.

于 2012-08-17T11:52:54.510 に答える