2011-01-22 3 views
1

"2つ以上の個別のSQLコマンド"または "1つの 'join' SQLコマンドを使用してパフォーマンスが疑わしいです。ここで2つの別々のSQL文またはJOINを持つ1つのSQL文を使用する方が速いのですか?

がものです:

たとえば、私は2つのテーブルがあります:postuser

postをこのポストを示すのuser_idがuser

にいくつかのユーザーによって発行されたと私はされてい投稿とユーザー名の両方を抽出します。

私はどちらか

 
SELECT * FROM `post` LEFT JOIN `user` on post.user_id = user.id WHERE 1 

または

 
$rows = $db->sql("SELEFT * FROM `post` WHERE 1") 
for $row in $rows: 
    $db->sql("SELECT * FROM `user` WHERE id = $row['user_id']") 

は、私は1つは、より良い性能を持っているであろう思ったんだけどできますか?

さらに、3つ以上のテーブルを結合すると、どちらの方がパフォーマンスが向上するのでしょうか?

+0

INNER JOINと比較して、LEFT JOIN(またはRIGHT JOINまたはFULL JOIN)を使用するとパフォーマンスが低下しますが、ゼロではありません。できればLEFT JOINを避けてJOINだけを使用してください。あなたはユーザーの記録がない投稿を持っていますか?もしそうでないなら(そしてそうすべきではありません)、INNER JOINが適切です。 –

答えて

5

ほとんどの場合、パフォーマンスが向上します。取得するデータが「大」であっても、依然として1つのクエリしか実行していません。

食料品を買うようなものです。一度に店に運転し、カートをいっぱいにし、さまざまなアイテムを家に持ち帰り、店に行ったり、買い物をしたり、家に帰ったり、店に行ったり、買い物をしたりするのは簡単です。

これらの旅行のそれぞれが加わると、あなたは食料雑貨を楽しむよりも多くの時間を運転することになります。

+0

ありがとう!私はそれが素晴らしい例だと思っています。私は今それを理解しています。 –

3

LEFT JOINを強くお勧めします。そうしないと、ループ内にクエリを配置すると(2番目の例のように)、データベース上で複数のヒットが発生するため、危険な状況になります。

3

2つのクエリを実行していないことに注意してください。最初のクエリを1回実行し、2回目のクエリをN回実行します。ここで、Nは最初のクエリによって返された行の数です。これは、問合せオプティマイザに単一の結合問合せを処理させるよりも、はるかに高価になります。

データベース・オプティマイザは、操作のコストを最小限に抑えるため、専門家によって慎重に書かれています。独立したクエリを実行してオプティマイザを推測しようとすると、オプティマイザが重大な問題を引き起こしている場合を除いて、毎回悪くなるはずです。それ以外の点では、DBMSは、呼び出されるたびに2回目のステートメントのバリエーションを1回ではなく準備する必要があります。オプティマイザは、あまりにも悪魔的に間違っていて、単に起こらないようにする必要があります。

関連する問題