优化left join on + where条件查询

在公司开发中常常会遇到关联表查询,当查询的数据表数据量变大时,需要我们来优化查询语句。

首先贴一个待优化的sql语句

select * from A left join B on A.c= B.c where A.employee_id = 3

类似于上图的查询语句很常见,在c字段不加任何索引的情况下,当A、B数据表中数据达到1w的情况下,用explain分析可得,使用全表查询,效率低下。
在这里插入图片描述
优化方案
1.给A、B表都加索引c
在这里插入图片描述
执行结果可以发现B表的索引起到了作用,B表没用进行全表查询,那为啥A表的索引不起作用呢?
因为Mysql内部的优化,使用小表驱动大表,它在估算到必须有一个表要全表扫描的话,一定会选择那个数据量更小的表去全表扫描,也就是说,在这个查询中,因为on以后的where条件列并没有使用到索引,所以mysql的优化只用到了表B的c索引,没有用到表A的索引!

2.给A、B表加上索引c,给A表再加一个employee_id的索引
在这里插入图片描述
执行结果可以发现A表的索引起到了作用,但是employee_id索引再c之前执行,这是为啥?
这一句Sql在执行的时候首先是选择了使用表B的索引来进行优化,将表A单独放出来进行后续的操作,然后,又发现了where语句中A.employee_id有一个聚合索引,并且employee_id处于索引头,所以这个聚合索引是可用的,so自然使用了此索引

3.给B加上索引c,给A表加上employee_id的索引
在这里插入图片描述
执行结果发现是没有问题的,所以综上所得这个方案是最优解

记录工作中细小点滴–xiang.xin

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值