6

簡単な質問です。これに対するさまざまな答えを見つけたので、よくわかりません。説明させてください:

次のようなクエリがある場合:

SELECT logins.timestamp, users.name
FROM logins 
LEFT JOIN users 
ON users.id = logins.user_id
LIMIT 10

これは基本的に、テーブルの最後の10エントリをリストし、をoverJOINloginsに置き換えます。user_idusername

さて、私の質問は、JOINが発生している間(最初の10エントリのみに参加するように)またはJOINの後にLIMITが有効になるかどうかです。(テーブル全体を結合し、最初の10エントリを切り取る場所)。

サンプルテーブルloginsには多くのエントリが含まれるため、これを求めています。JOINのパフォーマンスが高すぎるかどうかはわかりません。LIMITで10個のJOINのみが発生する場合、それは問題にはなりません。

これを思いついた2番目の質問:DISTINCTが追加された場合、機能は同じですか?それでも10エントリで停止しますか?いいえ、これはORDERBYによって注文されることはありません。

4

1 に答える 1

7

心配しないで。LIMITは結合と同時に発生します。MySQLはログインテーブル全体を読み取るのではなく、10行が見つかるまで行ごとにフェッチします(ユーザーは毎回結合します)。

users.idがテーブルに2回表示される場合、JOINはlogins行を複製し、各users行を追加することに注意してください。行の総数は引き続き10ですが、ログイン数は9になります。

于 2012-06-23T19:38:31.980 に答える