MySql的join操作到底是大表来驱动还是小表来驱动?

select * from t1 join t2 on (t1.a=t2.a);

t1表有100行数据,t2有1000行数据

1.假设t1的a字段和t2的a字段都有索引,此时如果以t1作为驱动表,t2作为被驱动表,那t1表全表扫描100行数据,t2表是会走索引的,所以每次扫描的次数是log2(1000),所以总的扫描次数就是100*log2(1000);相反,如果t2作为驱动表,t1作为被驱动表,则总的扫描次数为1000*log2(100),很明显第一种方案性能会更高,所以使用小表作为驱动表更好;

2.假设t1表的a字段和t2表的b字段都没有索引,此时如果以t1作为驱动表,t2作为被驱动表,那t1表全表扫描100行数据,t2表不走索引,所以每次扫描的次数是1000次,所以扫描的总次数就是100*1000,这是在内存能够存储t1所有数据的情况下,如果内存不能存储t1的所有数据时,则需要分批查处t1表的数据,然后再一次去扫描t2表的数据,此时的复杂读是:100+100*k*1000,k的取值范围是:0到1的小数;相反,如果t2作为驱动表,t1作为被驱动表,则总的扫描次数为:1000+1000*j*100,从以上分析,也能知道用小表作为驱动表性能会更好。

所以结论就是:join查询时用小表来作为驱动表性能会更好,但是需要注意的是,在项目开发中应该尽量避免连表查询,因为性能不好,对数据库资源占用过多。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值