简体   繁体   中英

Order of execution in MySQL query with multiple JOINS of subqueries

I have the following query with a LEFT JOIN between the first two subqueries e and a , and an INNER JOIN between the last two subqueries a and m :

SELECT {cols}
FROM 
(SELECT {cols}
 FROM {table} 
 WHERE {conditions}) AS e
LEFT JOIN
(SELECT {cols}
 FROM {table} 
 WHERE {conditions}) AS a
ON e.col = a.col
INNER JOIN
(SELECT {cols}
 FROM {table} 
 WHERE {conditions}) AS m
ON e.col = m.col

When I change the second join from INNER JOIN to LEFT JOIN , the execution time increase by a factor of ~200 . The number of records from each subquery is as follows:

e -> Number of records: 303
a -> Number of records: 18
m -> Number of recordings: 295

I assumed MySQL would evaluate each subquery as an independent subquery and then do the joins, in which case, the change from INNER JOIN to LEFT JOIN should not lead to such an increase in the execution time given the relatively low number of records as shown above.

So, obviously it seems that's not the execution order being followed.

EXPLAIN PLAN :

Case 1 with INNER JOIN: join e with m first, then join with a. 
Case 2 with LEFT JOIN: join e with a first, then join with m. 

I'm not sure why the two plans are different in the two cases and how this might lead to a difference in the execution time.

Can anyone help explain to me what the actual execution order may be?

The join order is up to the query planner to optimize as it sees fit. Sometimes it gets it wrong. If you think the join order is suboptimal you can force it by specifying SELECT STRAIGHT_JOIN instead of SELECT . This will force the query planner to join tables in the order listed in the query.

Outer joins are always going to be slower because they have to scan more rows - they cannot discard rows that don't match in both sides.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM