1

彼らは同じことをしますが、違いがあるかどうか知りたいです。つまり、パフォーマンスについてです...

TB1 : tb1_id -> PK ...

TB2 : tb1_id -> FK ...

select columns ... from tb1 a left join tb2 b
    on a.tb1_id=b.tb1_id and b.uid=xxxxxxx where a.tb1_id=yyy limit 1

select columns ... from tb1 a left join tb2 b
    on a.tb1_id=b.tb1_id where a.tb1_id=yyy and b.uid=xxxxxxx limit 1

ありがとう。

4

4 に答える 4

2

少し単純化すると、JOIN最初に s が評価され、次にWHEREs フィルターが適用されると考えることができます。次の式を使用します。

1)最初のクエリは、フィールドに一致する特定の値を持つ、テーブルからのすべてのレコードと、テーブルaからの対応するレコードb(存在する場合、そうでない場合は s のセット)を返します。結果のセットは、次のレコードのみを持つようにフィルター処理され、最初のレコードがクライアントに返されます。NULLtb1_iduida.tb1_id=yyy

2) 2 番目のクエリは、a一致する. 結果のセットは、特定の値を持つレコードだけが含まれるように除外されます。最後の部分が重要です。この特定の条件は、一致するセットがなかったすべてのレコードをテーブルから破棄します。基本的に、の「ハード」条件と a を混在させないでくださいこれを行うと、すぐにjoin をoneに変換します。残りのセットの最初のレコードがクライアントに返されます。bNULLtb1_ida.tb1_idb.uidabNULL != xxxxxxxLEFT JOINWHEREOUTERINNER

そうは言っても、あなたの場合、同じ結果が得られる可能性があります。偶然にも。クエリに が含まれていないORDER BYため、返されるレコードの順序はデータベース エンジンに依存します (決定論的ではなく、信頼できないと考えたほうがよいでしょう。いずれにせよそうなる可能性が非常に高いです)。そのため、両方のクエリによって返される最初のレコードが、すべての条件に一致するレコードであるtb1_idことaが起こりbます。xxxxxxxb.uid

于 2012-05-31T02:36:06.353 に答える
1

JOIN の 'LEFT' 部分に気付かなかったので、元の答えを疑いました。簡単な調査の後、回答を修正しました。

この記事では、クエリが実際には異なる方法で処理されることを示しながら、詳細に説明します。

これは、以下の記事の例で示されています。

mysql> SELECT * FROM product LEFT JOIN product_details
   ON (product.id = product_details.id)
   AND product_details.id=2;
+----+--------+------+--------+-------+
| id | amount | id   | weight | exist |
+----+--------+------+--------+-------+
|  1 |    100 | NULL |   NULL |  NULL |
|  2 |    200 |    2 |     22 |     0 |
|  3 |    300 | NULL |   NULL |  NULL |
|  4 |    400 | NULL |   NULL |  NULL |
+----+--------+------+--------+-------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM product LEFT JOIN product_details
   ON (product.id = product_details.id)
   WHERE product_details.id=2;
+----+--------+----+--------+-------+
| id | amount | id | weight | exist |
+----+--------+----+--------+-------+
|  2 |    200 |  2 |     22 |     0 |
+----+--------+----+--------+-------+
1 row in set (0.01 sec)
于 2012-05-31T02:40:45.147 に答える
0

これら 2 つのクエリはまったく同じことを行いません。最初のクエリは b から行を返さない可能性がありますが、b との有効な結合がない場合、2 番目のクエリは a または b から行を返さない可能性があります。

Mysql は where 句の "=" を INNER 結合であるかのように解釈します (これは結合ではありませんが、この場合も同じように使用されます)。

于 2012-05-31T01:28:49.913 に答える