mysql要不要使用join

本文探讨了如何通过explain分析SQL执行计划来判断join语句效率,并强调了在小表驱动原则下选择驱动表的重要性。讲解了根据表大小、字段过滤等因素确定驱动表的方法,以及如何避免BlockNested-LoopJoin导致的性能问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一个问题:能不能使用join语句?

可以使用explain查看sql执行计划,看extra列是Index Nested-Loop Join 算法还是 Block Nested-Loop Join 算法,如果是Index Nested-Loop Join 算法,则说明语句执行过程使用到了被驱动表的索引,那么使用join时没问题的;如果是Block Nested-Loop Join算法,扫描行数就会过多,这种情况下尽量不要使用join语句。

第二个问题:如果使用join语句应该使用大表做驱动表还是小表做驱动表

应该使用小表做驱动表。这里的小表指的是两个表按照各自的条件过滤,过滤完成之后,计算参与 join 的各个字段的总数据量小的那个表称之为小表。

比如t1表有100条数据,t2表有1000条数据,下面这种情况就应该使用t1做驱动表,因为t1只查b一个字段;


select t1.b,t2.* from  t1  straight_join t2 on (t1.b=t2.b) where t2.id<=100;
select t1.b,t2.* from  t2  straight_join t1 on (t1.b=t2.b) where t2.id<=100;

而下面这种情况就应该使用t2作为驱动表,这样join_buffer只需要放入前50条数据:


select * from t1 straight_join t2 on (t1.b=t2.b) where t2.id<=50;
select * from t2 straight_join t1 on (t1.b=t2.b) where t2.id<=50;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值