3

私の最後の質問(MySQLiのパフォーマンス、複数の(個別の)クエリとサブクエリ)に関連して、別の質問に出くわしました。

サブクエリを使用して別のテーブルから値を選択している場合があります(たとえば、IDに接続されているユーザー名)が、select-in-selectについてはよくわかりません。これは、あまりクリーンでなく、パフォーマンスについてはよくわかりません。

サブクエリは次のようになります。

SELECT
    (SELECT `user_name` FROM `users` 
     WHERE `user_id` = table2.user_id) AS `user_name`
    , `value1`
    , `value2`
FROM
    `table2`
....

table1の結果とtable2の結果に別々のクエリを使用する方が「良い」でしょうか(接続は2倍になりますが、テーブルをまたぐ必要はありません)、またはJOINを使用して単一のクエリで結果を取得する必要がありますか?

私はまだJOINSとサブクエリの経験があまりないので、この場合、JOINが「多すぎる」かどうかはわかりません。これは、IDに接続された名前が1つだけであるためです(または、テーブルからの行)、またはそれが問題ではない場合は、select-in-selectもある種のJOINのように扱われるためです。

JOINを使用したソリューションは、次のようになります。

SELECT
    users.user_name , table2.value1, table2.value2
FROM
    `table2`
INNER JOIN
    `users`
ON
    users.user_id = table2.user_id
....

そして、もし私がJOINを好むべきなら、この場合、どれが最も良いでしょう:左結合、内部結合、または何か他のもの?

4

1 に答える 1

6

inner joinあなたが使用するかどうかを尋ねているという事実は、left join実際にあなたがそれらで多くの仕事をしていないことを示しています。

これら2つの目的は完全に異なり、inner join一部の列の値が一致する2つ以上のテーブルから列を返すために使用されます。left join他のテーブルに一致する列がない場合でも、join句で指定されたテーブルの行を返す場合に使用されます。アプリケーションによって異なります。1つのテーブルにプレーヤーの名前があり、別のテーブルにプレーヤーが支払ったペナルティの詳細が含まれている場合はleft join、ペナルティなし、つまり2番目のテーブルにレコードがないプレーヤーを説明するためにを使用することをお勧めします。

サブクエリを使用するか、を使用するかに関してjoinjoin、適切に使用するとsがはるかに高速になります。つまり、結合列にインデックスがある場合、テーブルは含まれる行の数の昇順で指定され(通常、例外がある場合があります)、結合列のデータ型は類似しています。条件が一致joinする場合は、より適切なオプションになります。

于 2012-08-21T17:13:50.747 に答える