以下のクエリを考える
SELECT * FROM tableA
LEFT JOIN tableB ON tableB.id = tableA.id
WHERE tableA.name = 'e'
。
tableA tableB
----------- -----------
id name id school
----------- -----------
1 a 1 AA
2 b 2 BB
3 c 3 CC
4 d 4 DD
5 e 5 EE
。
私を困惑させるのは、背後で起こっているプロセスです。
システムは、WHERE句から行のみを選択する前に、まずtableAとtableBの両方を結合しますか?
はいの場合、このクエリはどうですか
SELECT * FROM
(
SELECT * FROM tableA
WHERE name = 'e'
) A LEFT JOIN tableB ON tableB.id = A.id
このクエリは、他のテーブルにJOINする前に、まずWHERE句を使用して選択しますか?
ウェブで回答が見つかりません。 MySQLリソースの帯域幅を減らしたかった。 2番目のクエリはこの状況に最適ですか?
クエリオプティマイザーが決定し、かなりスマートです。
SELECT * FROM tableA
LEFT JOIN tableB
ON tableB.id = tableA.id
WHERE tableA.name = 'e'
最初に結合を行う方が効率的である場合が多くあります。名前にインデックスが付けられ、 'e'がある程度一意である場合、最初に行う方が効率的です。
これは違う
SELECT * FROM tableA
LEFT JOIN tableB
ON tableB.id = tableA.id
WHERE tableB.school = 'EE'
これにより、左結合が内部結合に変更されますが、データに一致があるため、同じ結果が得られます。