MySQL join大小表前后顺序影响分析

本文探讨了在SQL join查询中,为何推荐使用小表作为驱动表,通过执行计划分析和时间复杂度解释,揭示了小表驱动带来的效率优势。通过数据准备和实际案例,展示了如何优化查询性能并避免全表扫描。

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

前言

我相信你一定听说过在做两张表join查询时,要让小表作为驱动表,如果你不知道这是为什么,那么本文就通过分析join的执行过程,来回答这个问题。

一、数据准备

新建了两张表,分别为t1,t2。

t1表结构

在这里插入图片描述
在这里插入图片描述

t2表结构

在这里插入图片描述

在这里插入图片描述

其中t1表1W条数据,t2表10W条。t1表中的1W条数据与t2是相同的。

二、join查询

使用小表作为驱动表

select * from t1 left join t2 on t1.a = t2.a;

在这里插入图片描述

使用大表作为驱动表

select * from t2 left join t1 on t1.a = t2.a;

在这里插入图片描述

通过执行计划分析

小表驱动

EXPLAIN select * from t1 left join t2 on t1.a = t2.a;

在这里插入图片描述
大表驱动
在这里插入图片描述

当大表作为驱动表时,查询时间大约比小表作为驱动表时慢了一倍,从执行计划也能分析出,谁是驱动表谁就会进行全表扫描,所以这也是为什么要让小表作为驱动表的原因。

三、join流程分析

从下面这个执行计划中我们可以看出,join的执行流程应该如下:
在这里插入图片描述

1、先从t2表中取出一行数据,然后拿到a这个字段
2、用a这个字段与t1表进行匹配,类似如下sql:select * from t1 where t1.a = ?(?就是第一步中从t2里取到的字段a的值)
3、由于t1表的a字段时有索引的,所以可以走索引扫描,如果匹配的上就把结果记录下来
4、继续重复1~3流程,执行扫描完所有t2表中的数据。

四、通过时间复杂度解释为什么要让小表作为驱动表

分析完join流程后,我们可以得到,整个过程的时间复杂度应该是t2表的行数(M)+ t1表走索引的时间复杂度(logN)

所以大致的时间复杂度应该是:M * logN,可以看出M对于整个时间复杂度的影响更大,因此应该尽量让小表作为驱动表。

以上结论是建立在被驱动表可以使用索引的前提下,如果被驱动表不能使用索引,那就会发生Using join buffer (Block Nested Loop),关于这个问题,在之后的文章中我们可以再进行分析。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码拉松

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值