9

4つのUNIONSと4つのLEFTJOINSを持つSQLクエリがあります。それはそのようにレイアウトされています:

SELECT ... FROM table1
    LEFT JOIN other_table1
UNION SELECT ... FROM table2
    LEFT JOIN other_table2
UNION SELECT ... other_table3
    LEFT JOIN other_table3
UNION SELECT ... FROM table4
    LEFT JOIN other_table4

4つの別々のクエリを実行し、事後に結果をphpとマージする方がよいでしょうか?それとも私はそれらを一緒に保つべきですか?どれがその最速の実行を提供しますか?

4

4 に答える 4

5

最も決定的な答えは、各メソッドをテストするUNIONことですが、ユニオンの各部分に対して4つではなく、MySQLによって実行されるクエリが1つだけであるため、より高速になる可能性があります。

また、PHPのメモリにデータを読み込んで連結するオーバーヘッドを取り除きます。代わりに、1つの結果に対してwhile()またはまたは何でも実行できます。foreach()

于 2012-08-08T16:02:08.053 に答える
0

When a query is executed from a programming language, following steps occur

  1. A connection is created to between application and database (or an existing connection is used from pool)
  2. Query is sent to database
  3. Database sends the result back
  4. Connection is released to pool

If you are running N number of queries, above steps happen N number of times, which you can guess will definitely slow down the process. So ideally we should keep number of queries to as minimum as possible.

It will make sense to break a query into multiple parts if single query becomes complex and it gets difficult to maintain and takes a lot of time to execute. In that case too, good way will be to optimize the query itself.

As in your case, query is pretty simple, and as someone has pointed out that union will also help removing duplicate rows, the best way is to go for sql query than php code. Try optimization techniques like creating proper indexes on tables.

于 2012-08-08T16:20:18.763 に答える
0

この場合、結果から取得するレコードの数によって異なります。すべてのユニオンで左結合を使用しているため、ボトルネックを回避SQLして結果をマージするために、別のフェッチを実行することをお勧めします。PHP

于 2012-08-08T16:04:28.333 に答える
0

UNION句は、個別のレコードを一度に返すため(重複したレコードは返されません)、より高速になります。そうでない場合は、アプリケーションで行う必要があります。また、この場合、トラフィックを減らすのに役立つ場合があります。

ドキュメントから:

UNIONのデフォルトの動作では、重複する行が結果から削除されます。オプションのDISTINCTキーワードは、重複行の削除も指定しているため、デフォルト以外の効果はありません。オプションのALLキーワードを使用すると、重複行の削除は行われず、結果にはすべてのSELECTステートメントからの一致するすべての行が含まれます。

同じクエリでUNIONALLとUNIONDISTINCTを混在させることができます。混合UNION型は、DISTINCT共用体が左側のすべての共用体をオーバーライドするように扱われます。DISTINCTユニオンは、UNION DISTINCTを使用して明示的に作成することも、後続のDISTINCTまたはALLキーワードを指定せずにUNIONを使用して暗黙的に作成することもできます。

于 2012-08-08T16:11:10.760 に答える