1 left join
EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card = book.card;
LEFT JOIN条件用于确定如何从右表搜索行, 左边一定都有,
#所以右边是我们的关键点,一定需要建立索引。
结论:在优化关联查询时,只有在被驱动表上建立索引才有效!
left join 时,左侧的为驱动表,右侧为被驱动表
2 right join
条件用于确定如何从左表搜索行, 右边一定都有
EXPLAIN SELECT*FROM class RIGHT JOIN book ON class.card=book.card;
所以左边是我们的关键点,一定需要建立索引。
3 inner join 时
mysql 会自己帮你把小结果集的表选为驱动表。
但是会强制将左侧作为驱动表!
记住:永远用小的结果集驱动大的结果集
4 多表关联时
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;
上述两个案例,第一个查询效率较高,且有优化的余地。
第二个案例中,子查询作为被驱动表,由于子查询是虚表, 无法建立索引,因此不能优化。
结论:子查询尽量不要放在被驱动表,有可能使用不到索引;
left join时,尽量让实体表作为被驱动表。
能够直接多表关联的尽量直接关联,不用子查询!
EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card = book.card;
LEFT JOIN条件用于确定如何从右表搜索行, 左边一定都有,
#所以右边是我们的关键点,一定需要建立索引。
结论:在优化关联查询时,只有在被驱动表上建立索引才有效!
left join 时,左侧的为驱动表,右侧为被驱动表
2 right join
条件用于确定如何从左表搜索行, 右边一定都有
EXPLAIN SELECT*FROM class RIGHT JOIN book ON class.card=book.card;
所以左边是我们的关键点,一定需要建立索引。
3 inner join 时
mysql 会自己帮你把小结果集的表选为驱动表。
但是会强制将左侧作为驱动表!
记住:永远用小的结果集驱动大的结果集
4 多表关联时
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;
上述两个案例,第一个查询效率较高,且有优化的余地。
第二个案例中,子查询作为被驱动表,由于子查询是虚表, 无法建立索引,因此不能优化。
结论:子查询尽量不要放在被驱动表,有可能使用不到索引;
left join时,尽量让实体表作为被驱动表。
能够直接多表关联的尽量直接关联,不用子查询!