60,137
社区成员
发帖
与我相关
我的任务
分享
EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card = book.card;
LEFT JOIN条件用于确定如何从右表搜索行, 左边一定都有,
所以右边是我们的关键点,一定需要建立索引 。
结论: 在优化关联查询时,只有在 被驱动表 上建立索引才有效 !
left join 时,左侧的为驱动表,右侧为被驱动表
条件用于 确定如何从左表搜索行, 右边一定都有
EXPLAIN SELECT*FROM class RIGHT JOIN book ON class.card=book.card;
所以左边是我们的关键点,一定需要建立索引 。
mysql 会自己帮你把小结果集的表选为驱动表 。
但是会强制将左侧作为驱动表!
记住:永远用小的结果集驱动大的结果集
EXPLAIN SELECT ed.name '人物',c.name '掌门' FROM (SELECT e.name,d.ceo from t_emp e LEFT JOIN t_dept d on e.deptid=d.id) ed LEFT JOIN t_emp c on ed.ceo= c.id;( 较好)
EXPLAIN SELECT e.name '人物',tmp.name '掌门' FROM t_emp e LEFT JOIN (SELECT d.id did,e.name FROM t_dept d LEFT JOIN t_emp e ON d.ceo=e.id)tmp ON e.deptId=tmp.did;
上述两个SQL,第一个查询效率较高,且有优化的余地。
第二个SQL中,子查询作为被驱动表,由于子查询是虚表, 无法建立索引,因此不能优化。
能够直接多表关联的尽量直接关联,不用子查询!