学习记录376@MySQL inner join 优化之小表驱动大表的原因

我的理解是,要明白原因,就要先知道inner join的原理

inner join 优化小表驱动大表介绍

在数据库查询中
SELECT * FROM 小表 INNER JOIN 大表 ON 小表.id=大表.id
效率高于
SELECT * FROM 大表 INNER JOIN 小表 ON 小表.id=大表.id
前者时间更短!

inner join 原理 AND 小表驱动大表的原因

其实其他join也是这个原理,只是MySQL只对inner join 自动的进行小表驱动大表的有优化。
join的原理是,查询出每一条前表的数据,然后放入join_buffer(可理解为一个内存区域即可)中,直到join_buffer中装不下数据,然后将后表加载进内存,和这些数据进行匹配,找出连接的数据,然后后表存内存中踢出;如果前表中还有数据,就再一条一条的查找出来,一条一条的放入join_buffer中,直到join_buffer中装不下数据,然后将后表加载进内存,和这些数据进行匹配,找出连接的数据,然后后表存内存中踢出;最后合并查询出所有的数据!
join_buffer的默认大小为256KB,可以使用命令show VARIABLES LIKE ‘%join_buffer%’,查看自己电脑的join_buffer的大小:
在这里插入图片描述
以上 join 原理核心点有两个:

  1. 前表查询出数据需要一条一条的加入到join_buffer中,这需要IO操作,比较耗时,因此如果前表比较小,那么效率就高,这是小表驱动大表的一个主要原因
  2. 将join_buffer中的数据和后表中的数据进行匹配,如果连接得字段可以使用索引,那么效率就更高了,但是如果没有索引,抛开核心点1得IO操作时间,那么小表驱动大表和大表驱动小表效率其实是差不多得,因为都需要双循环,MN 和NM是差不多的。

总结

前表查询出数据需要一条一条的加入到join_buffer中,这需要IO操作,比较耗时,因此如果前表比较小,那么效率就高,这是小表驱动大表的一个主要原因;
将join_buffer中的数据和后表中的数据进行匹配,如果连接得字段可以使用索引,那么效率就更高了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值