I've been developing for years and through out the carrier I've been using only LEFT JOIN as it provides a more logical sense of mapping my one to many data.
However recently I ran across a performance thought:
Say I have table user with millions of rows and table gender with only 2 rows
user gender
===================== ================
id name genderId id gender show
===================== ================
1 Sam 1 1 Male 0
2 Samantha 2 2 Female 1
3 Another millions of records
If I'm doing
select * from user u left join gender g on u.genderId = g.id where g.show = 1;
Does SQL engine joins the whole million user records first, then scan the million rows of records for join projected value?
Or is the engine smart enough to query and join only the rows with correct gender? Or is RIGHT JOIN the correct method to provide best performance?
If the behavior is dependent on engine type, let's talk about MySQL InnoDB.
EXPLAIN query
output. Even if you have a gender.id pinned at 2,genderId
in user may not be indexed, and even if it was it would be a large proportion of a secondary index, and you still need to look up name and id, so it might not be used.LEFT
vsRIGHT
won't matter at all.LEFT JOIN
should be used when there isn't always RHS match, rather than just one to many, even a basicINNER JOIN
does many to many.sets
at all. All we can do is to emulate thesets
bylists
and perform thesearch
instead offetch
. Therefore the correct question should sound like that: "Why this query over that tables with that indexing and that cardinalities is slow?"user.gender_id = 3
and there is no corresponding row in the tablegender
.