背景
在我没有遇到这个问题时我一直认为 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
。