[ 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时,尽量让实体表作为被驱动表。

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

...全文
67 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
mysql学习总结, 表与表的关系 表:具有固定列数和任意行数。 数据库:一些关联表的集合。 主键:一个数据表只能包含一个主键,使用主键来查询数据。 外键:用来关联两张表。 索引:快速访问数据库表的特定信息,索引是对数据库表一列和多列的值进行排序的一种数据结构。 DDL:数据定义语言:定义数据库对象:创建库,表,列等。 DML:数据操作语言:用来操作数据库表中的记录。 DQL:数据查询语言:用来查询数据。 DCL:数据控制语言:用来定义访问权限和安全级别。 oracle 创建用户: CREATE USER 用户名 IDENTIFIED BY 密码; grant resource ,connect to 用户名; mysql数据库分为两类: 系统数据库: information_schema:存储数据库对象信息(例如:用户表信息,列信息等里面内容不能动)。 performance_schema:存储数据库服务器性能参数信息。 mysql:存储数据库用户权限信息。 sys:以视图形式将information_schema和performance_schema结合,查询出更容易理解数据。 用户数据库:   用户自己创建的数据库,一个项目一个数据库。 常用数据类型: double:浮点型(double(5,2)表示最多5位,其中必须有两位小数)。 char:固定长度字符串类型 varchar:可变长度字符串类型 text:字符串类型 blob:二进制类型 data:日期类型(格式为:yyyy-MM-dd) time:时间类型(格式为:hh:mm:ss) datatime:日期时间类型(格式为:yyyy-MM-dd hh:mm:ss) 在mysql中字符串类型和日期类型都要用单引号括起来。('mysql','2020-01-01')

60,137

社区成员

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

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