1

次のジョブ選択クエリがあります(実際のクエリは多数の結合で大規模です)メインクエリ:

SELECT id FROM job LIMIT 20

ユーザーがログインするときに、ユーザーがジョブを保存したかどうかを選択したい。(多くのユーザーが、主な結果は 1 つ)

私の質問は、より効率的な方法ですか?(クエリキャッシュ、バッファプールなどの観点から考える)
方法1:

SELECT id, Member 
FROM job AS t1 LEFT JOIN Member AS t2 ON (t1.id=t2.Job) LIMIT 20

(つまり、ユーザーがジョブを保存しなかった場合、Select Member に対して「Null」が返されます)

方法 2:
主な結果に対してメイン クエリを使用し、次に各結果に対して選択します (つまり、ループ SQL クエリ)。

 SELECT Member FROM Member WHERE Member=1 AND Job=(each job id)
4

2 に答える 2

0

左結合を使用する方法は、より効率的であることがほぼ保証されています。

基礎となるロジックは本質的に同じですが (つまり、同じ値に対して同じ列を比較している)、LEFT JOIN クエリは解析にコストがかかりますが、LEFT JOIN を使用する場合は、1 ラウンドしか実行しません。ループされたクエリを使用してサーバーにトリップし、同じ結果を得るために複数のラウンドトリップを行っています。

一般的に言えば、その多くは特定の設定とデータに依存するため、このような質問に一般的な回答を与えることは困難ですが、この場合、単一の LEFT JOIN クエリが大幅に高速化されることがわかります。

過去にそのようなクエリのベンチマークを行ったことがありますが、LEFT JOIN アプローチは常に高速でした。

于 2013-04-01T20:28:25.307 に答える