[ MySQL - Performance ] 多表关联查询 索引优化

bluetata
云计算领域优质创作者
博客专家认证
2023-02-14 11:04:50

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;

上述两个SQL,第一个查询效率较高,且有优化的余地。
第二个SQL中,子查询作为被驱动表,由于子查询是虚表, 无法建立索引,因此不能优化。

总结

  1. 子查询尽量不要放在被驱动表,有可能使用不到索引;
  2. left join时,尽量让实体表作为被驱动表。

能够直接多表关联的尽量直接关联,不用子查询!

...全文
78 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

71,314

社区成员

发帖
与我相关
我的任务
社区描述
本社区以云计算与云原生技术交流为主,希望有同样技术栈有兴趣的朋友加入,一起分享交流。
云计算云原生网络安全 个人社区
社区管理员
  • bluetata
  • 会洗碗的CV工程师
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧