| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
LEFT JOIN and RIGHT JOIN
A LEFT JOIN B join_condition in MySQL is implemented as follows:
B is set to be dependent on table A and all tables
that A is dependent on.
A is set to be dependent on all tables (except B)
that are used in the LEFT JOIN condition.
LEFT JOIN condition is used to decide how we should retrieve rows
from table B. (In other words, any condition in the WHERE clause
is not used).
WHERE optimizations are done.
A that matches the WHERE clause, but there
wasn't any row in B that matched the ON condition,
then an extra B row is generated with all columns set to NULL.
LEFT JOIN to find rows that don't exist in some
table and you have the following test: column_name IS NULL in the
WHERE part, where column_name is a column that is declared as
NOT NULL, then MySQL will stop searching after more rows
(for a particular key combination) after it has found one row that
matches the LEFT JOIN condition.
RIGHT JOIN is implemented analogously to LEFT JOIN.
The table read order forced by LEFT JOIN and STRAIGHT JOIN
will help the join optimizer (which calculates in which order tables
should be joined) to do its work much more quickly, as there are fewer
table permutations to check.
Note that the above means that if you do a query of type:
SELECT * FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key)
WHERE b.key=d.key
|
MySQL will do a full scan on b as the LEFT JOIN will force
it to be read before d.
The fix in this case is to change the query to:
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key)
WHERE b.key=d.key
|
Starting from 4.0.14, MySQL does the following LEFT JOIN optimization:
If the WHERE condition is always be false for the generated
NULL row, the LEFT JOIN is changed to a normal join.
For example, in the following query the WHERE clause would be
false if t2.column would be NULL so it's safe to convert to
a normal join.
SELECT * FROM t1 LEFT t2 ON (column) WHERE t2.column2 =5; -> SELECT * FROM t1,t2 WHERE t2.column2=5 AND t1.column=t2.column; |
This can be made faster as MySQL can now use table t2 before
table t1 if this would result in a better query plan. To force a
specific table order, use STRAIGHT JOIN.
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |