2012-01-30 13 views
0

データベースクエリについて質問したいと思います。問合せのwhere節が別の問合せから来るような問合せの場合たとえば、ネストされたクエリの実行者

select ? from ? where ? = select ? from ? 

これは簡単な例ですので、これを書きやすいです。しかし、より複雑なケースでは、私はパフォーマンスの場合に最良の方法が何であるかを知りたいです。参加しますか?別のクエリ?ネストされたものか別のものか?

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

よろしくお願いいたします。

+2

は、RDBMSのオプティマイザに依存しますが、通常は結合が優先されます。 –

答えて

1

テストする必要があります。これらのことは、クエリの詳細とそれが使用できるインデックスに大きく依存します。

私の経験では、JOINはMySQLのネストされたクエリより速い傾向があります。場合によっては、MySQLはあまりスマートではなく、外部クエリによって生成されたすべての行に対してサブクエリを実行するように見えます。

あなたは公式ドキュメントではこれらの事についての詳細を読むことができます:

最適化サブクエリ:ジョインとしてhttp://dev.mysql.com/doc/refman/5.6/en/optimizing-subqueries.html
書き換えサブクエリ:http://dev.mysql.com/doc/refman/5.6/en/rewriting-subqueries.html

0

ミッチとジョニが述べたように、それが依存しています。しかし、一般的には、最高のパフォーマンスを提供するジョインです。外部クエリの各行に対してネストされたクエリを実行しないようにしようとしています。良いクエリオプティマイザは、あなたがやろうとしていることを解釈し、間違いを本質的に「修正」することで、あなたのためにこれを行うかもしれません。しかし、大部分のクエリでは、最初に結合として記述する必要があります。そうすることで、あなたは何をしようとしているのかを明確にしており、何が行われているのかを完全に理解しており、最も効果的なやり方は何ですか。

0

私は、主に等価と明示的なJOINを持っているため、結合をより迅速に行うことを期待しています。 SQlエンジンがそれらをどのように解釈するかの違いを見るために、説明を使用してください。
サブクエリの代わりにジョインを使用すると、相関サブクエリを使用するときにパフォーマンスが大幅に向上します。

1

これは場合によって異なります。あなたは内側のクエリで非常に少ない結果を持っている場合は、あなたはそれのために行く必要があります。このフローは、内部クエリが最初に実行され、結果セットが外部クエリで使用されるように動作します。 一方、ジョインはデカルト積をもたらします。これはやはり重い操作です。

0

ほとんど誰もが、私が持っていたまったく逆の経験を言うためにログインした最適なパフォーマンスをジョインが与えると言っています。

私は数日前に、膨大な量のデータを持つ3-4テーブルのクエリを書いていました。私はジョインで大きなSQLクエリを書いて、それを実行するのに約2〜3時間かかっていました。次に、私はそれを再構築し、ネストされた選択クエリを作成し、入れ子にされた1つの内部の制約を可能な限りより厳しくした後、パフォーマンスを90%以上向上させたところで、実行するのに4分もかかりません。

これはちょうど私の経験であり、理論的には結合が良いかもしれません。私は自分の経験を分かち合いたいと思った。他のものを試してみること、テーブルについての知識を増やすこと、索引などが役立つだろう。

更新:

そして私はちょうど私が実際のMySQLのこの最適化リファレンス・ページで提案された事が分かりました。 http://dev.mysql.com/doc/refman/5.6/en/optimizing-subqueries.html

は、クイックリファレンスのためにそれをここに貼り付け:

は、サブクエリでの参加を交換してください。たとえば、次のように試してください。

SELECT DISTINCT column1 FROM t1 WHERE t1.column1 IN(SELECT columnFROM t2);これに代えて

T1からDISTINCT t1.column1を選択T2 t1.column1 = t2.column1。

サブクエリの外側から内側に句を移動します。例えば、 にこのクエリを使用:

SELECT * FROM T1 WHERE S1において(T2からT1のUNION ALL SELECT S1を S1から選択)。このクエリの代わりに:

SELECT * FROM t1 WHERE s1 IN(SELECT s1 FROM t1)またはs1 IN(SELECT s1 FROM t2);別の例として、次のクエリを使用します。

SELECT(SELECT column1 + 5 FROM t1)FR2 t2;このクエリの代わりに:

SELECT(SELECT column1 FROM t1)+ 5 FROM t2;

関連する問題