0

次のようなものがあります。

SELECT c.id
FROM contact AS c
WHERE c.id IN (SELECT s.contact_id 
    FROM sub_table AS s
        LEFT JOIN contact_sub AS c2 ON (s.id = c2.sub_field)
    WHERE c2.phone LIKE '535%')
ORDER BY c.name

問題は、クエリに非常に長い時間がかかることです(> 2分)が、サブクエリを取得して個別に実行し、IDを内破してメインクエリに挿入すると、1秒未満で実行されます。データの取得と内破。

メソッドとキーの両方の説明が適切に同じ方法で使用されていることを確認しました。サブクエリは 200 を超える ID を返しません。

サブクエリ メソッドにこれほど長い時間がかかる原因は何でしょうか?

ところで、上記のクエリは結合で記述できることは知っていますが、私が持っているクエリはそうではありません。これは単純化されたバージョンです。

MySQL 5.0.22 を使用。

4

6 に答える 6

3

MySQL バグ #32665: Query withdependent subquery is too slowのように疑わしいように聞こえます。

于 2009-04-06T21:12:57.247 に答える
1

このように試してみるとどうなりますか?

SELECT c.id
FROM contact AS c
INNER JOIN (SELECT s.contact_id 
    FROM sub_table AS s
        LEFT JOIN contact_sub AS c2 ON (s.id = c2.sub_field)
    WHERE c2.phone LIKE '535%') subq ON subq.contact_id=c.id
ORDER BY c.name

s.contact_id の結果が一意であると仮定します。そうでない場合は、サブクエリにdistinctを追加できます。

where 句で IN 演算子を使用するのではなく、常にこの方法で相関のないサブクエリを使用します。

于 2009-04-06T21:36:38.093 に答える
0

クエリの実行計画を確認しましたか? これにより、通常、問題が表示されます。

于 2009-04-06T21:11:28.980 に答える
0

相関サブクエリです。外側の選択の行ごとに 1 回実行されます。(と思います。同じ相関名のテーブルが 2 つあるのですが、タイプミスだと思います。結合として書き直せないということは、相関していることを意味します。)

わかりました、試してみたいものをあげます。あなたは、サブクエリが相関しておらず、まだ参加できないと言っています。そして、サブクエリの出力を取得し、それをサブクエリの代わりに字句的に置き換えると、メイン クエリははるかに高速に実行されます。

サブクエリをビューにします:create view fooサブクエリのテキストが続きます。次に、メイン クエリを書き直して "IN" 句を削除し、代わりにビューに結合します。

そのタイミングは?

于 2009-04-06T21:13:01.800 に答える
0

サブクエリの代わりに別の結合を行うことはできませんか?

SELECT c.id
FROM contact AS c
JOIN sub_table AS s on c.id = s.contact_id
LEFT JOIN contact_sub AS cs ON (s.id = cs.sub_field)
WHERE cs.phone LIKE '535%'
ORDER BY c.name
于 2009-04-06T21:16:08.080 に答える
0

サブクエリはsub_field外部選択のフィールドを参照しているため、外部テーブルの行ごとに 1 回実行する必要があります。内部クエリの結果は、外部テーブルの各行で変わります。

于 2009-04-06T21:16:16.987 に答える