0

膨大な量の情報が結合されているため、クエリが特に遅くなります。ただし、id in (select id from table) の形で where 句を追加する必要がありました。

次のことから何か利益があるかどうか、さらに差し迫ったことで、望ましい結果が得られるかどうかを知りたい.

select a.* from a where a.id in (select id from b where b.id = a.id)

代わりに:

select a.* from a where a.id in (select id from b)

更新: MySQL より具体的にはできません。申し訳ありませんが、テーブルは実質的に 7 つの異なるテーブル間の結合です。* の使用は例です

編集、b が選択されない

4

7 に答える 7

0

YMMV ですが、IN の代わりに EXISTS を使用すると、クエリの実行が高速になることがよくあります。

SELECT a.* FROM a WHERE EXISTS (SELECT 1 FROM b WHERE b.id = a.id)

もちろん、クエリの残りの部分とコンテキストを確認しないと、クエリが高速化されない可能性があります。

JOIN の方がより望ましいオプションかもしれませんが、a.id が b の id 列に複数回出現する場合は、そこに DISTINCT をスローする必要があり、最適化の観点から後戻りする可能性が高くなります。

于 2009-05-14T21:21:52.750 に答える
0

このようなサブクエリは絶対に使用しません。結合ははるかに高速です。

select a.*
from a 
join b on a.id = b.id

もちろん、 select * も使用しないでください (特に、少なくとも 1 つのフィールドが繰り返される結合を行う場合は決して使用しないでください)。不要なデータを送信するためにネットワーク リソースが浪費されます。

于 2009-05-14T21:22:13.247 に答える
0

実行計画を見ましたか?

どうですか

select a.* 
from a 
inner join b
on a.id = b.id

おそらくidフィールドは主キーですか?

于 2009-05-14T21:23:33.603 に答える
0
Select a.* from a
inner join (Select distinct id from b) c
on a.ID = c.AssetID

3つのバージョンすべてを試しましたが、ほぼ同じように動作しました。実行計画は同じでした (内部結合、IN (サブクエリの where 句の有無にかかわらず)、Exists)

B から他のフィールドを選択していないので、Where IN(Select...) を使用することをお勧めします。誰でもクエリを見て、何をしようとしているのかを知ることができます (b の場合にのみ表示されます)。

于 2009-05-14T21:32:52.147 に答える
0

あなたの問題は、「a」内の7つの表にある可能性が最も高いです

FROM テーブルに「a.id」を含めるようにします 次の結合を作成します: 内部結合 b on a.id = b.id

次に、他の 6 つのテーブルに参加します。

本当の助けが必要な場合は、クエリ全体を表示し、すべてのインデックスをリストし、各テーブルの行数を概算する必要があります

于 2009-05-14T21:50:49.637 に答える