背景

在我没有遇到这个问题时我一直认为 left join 的左边的表会作为驱动表而使用 join 会是 MySQL 根据对性能分析自动选择。

但是实际上并不是这样的 left join 左边并不会一直驱动表他还是会受 MySQL 优化引擎优化。

实验

SELECT count(*) FROM `order` -- 4754815
SELECT count(*) FROM `tags` -- 2380
EXPLAIN SELECT
	*
FROM
	`order`
	LEFT JOIN tags ON `order`.task_tag_title = tags.title 

这时候发现 MySQL 并没有优化我们的 SQL 而是大表驱动小表但是如果我们改成这样

EXPLAIN SELECT
	`order`.*
FROM
	`order`
	left JOIN tags ON `order`.task_tag_title = tags.title
WHERE tags.id > 0
ORDER BY tags.id

这时候 tag 表变成了驱动表,其实不难发现这条 SQL 完全等价于 inner join MySQL 机智的选择用 inner join 替换了 left join 这样的话优化引擎就可以自己选择合适的驱动表和被驱动表。

结果

where 条件中存在子表非 null 条件 MySQL 会进行优化成 inner join