前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >join 语句怎么优化?

join 语句怎么优化?

作者头像
Java识堂
发布于 2022-05-19 04:34:52
发布于 2022-05-19 04:34:52
1.3K00
代码可运行
举报
文章被收录于专栏:Java识堂Java识堂
运行总次数:0
代码可运行

Simple Nested-Loop Join

我们来看一下当进行 join 操作时,mysql是如何工作的。常见的 join 方式有哪些?

如图,当我们进行连接操作时,左边的表是「驱动表」,右边的表是「被驱动表」

Simple Nested-Loop Join 这种连接操作是从驱动表中取出一条记录然后逐条匹配被驱动表的记录,如果条件匹配则将结果返回。然后接着取驱动表的下一条记录进行匹配,直到驱动表的数据全都匹配完毕

「因为每次从驱动表取数据比较耗时,所以MySQL并没有采用这种算法来进行连接操作」

Block Nested-Loop Join

既然每次从驱动表取数据比较耗时,那我们每次从驱动表取一批数据放到内存中,然后对这一批数据进行匹配操作。这批数据匹配完毕,再从驱动表中取一批数据放到内存中,直到驱动表的数据全都匹配完毕

批量取数据能减少很多IO操作,因此执行效率比较高,这种连接操作也被MySQL采用

对了,这块内存在MySQ中有一个专有的名词,叫做 join buffer,我们可以执行如下语句查看 join buffer 的大小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
show variables like '%join_buffer%'

把我们之前用的 single_table 表搬出来,基于 single_table 表创建2个表,每个表插入1w条随机记录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE single_table (
    id INT NOT NULL AUTO_INCREMENT,
    key1 VARCHAR(100),
    key2 INT,
    key3 VARCHAR(100),
    key_part1 VARCHAR(100),
    key_part2 VARCHAR(100),
    key_part3 VARCHAR(100),
    common_field VARCHAR(100),
    PRIMARY KEY (id),
    KEY idx_key1 (key1),
    UNIQUE KEY idx_key2 (key2),
    KEY idx_key3 (key3),
    KEY idx_key_part(key_part1, key_part2, key_part3)
) Engine=InnoDB CHARSET=utf8;

create table t1 like single_table;
create table t2 like single_table;

如果直接使用 join 语句,MySQL优化器可能会选择表 t1 或者 t2 作为驱动表,这样会影响我们分析sql语句的过程,所以我们用 straight_join 让mysql使用固定的连接方式执行查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from t1 straight_join t2 on (t1.common_field = t2.common_field)

运行时间为0.035s

执行计划如下

在Extra列中看到了 Using join buffer ,说明连接操作是基于 「Block Nested-Loop Join」 算法

Index Nested-Loop Join

了解了 「Block Nested-Loop Join」 算法之后,可以看到驱动表的每条记录会把被驱动表的所有记录都匹配一遍,非常耗时,能不能提高一下被驱动表匹配的效率呢?

估计这种算法你也想到了,就是给被驱动表连接的列加上索引,这样匹配的过程就非常快,如图所示

我们来看一下基于索引列进行连接执行查询有多快?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from t1 straight_join t2 on (t1.id = t2.id)

执行时间为0.001秒,可以看到比基于普通的列进行连接快了不止一个档次

执行计划如下

「驱动表的记录并不是所有列都会被放到 join buffer,只有查询列表中的列和过滤条件中的列才会被放入 join buffer,因此我们不要把 * 作为查询列表,只需要把我们关心的列放到查询列表就好了,这样可以在 join buffer 中放置更多的记录」

如何选择驱动表?

知道了 join 的具体实现,我们来聊一个常见的问题,即如何选择驱动表?

「如果是 Block Nested-Loop Join 算法:」

  1. 当 join buffer 足够大时,谁做驱动表没有影响
  2. 当 join buffer 不够大时,应该选择小表做驱动表(小表数据量少,放入 join buffer 的次数少,减少表的扫描次数)

「如果是 Index Nested-Loop Join 算法」

假设驱动表的行数是M,因此需要扫描驱动表M行

被驱动表的行数是N,每次在被驱动表查一行数据,要先搜索索引a,再搜索主键索引。每次搜索一颗树近似复杂度是以2为底N的对数,所以在被驱动表上查一行的时间复杂度是2*log2^N

驱动表的每一行数据都要到被驱动表上搜索一次,整个执行过程近似复杂度为M + M*2*log2^N

「显然M对扫描行数影响更大,因此应该让小表做驱动表。当然这个结论的前提是可以使用被驱动表的索引」

「总而言之,我们让小表做驱动表即可」

「当 join 语句执行的比较慢时,我们可以通过如下方法来进行优化」

  1. 进行连接操作时,能使用被驱动表的索引
  2. 小表做驱动表
  3. 增大 join buffer 的大小
  4. 不要用 * 作为查询列表,只返回需要的列
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java识堂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
千兆之上:家庭网络 2.5G 升级实践
本篇文章,我们聊聊最近的一些关于家庭网络和网络设备折腾的事情,以及背后的一些小的考虑。
soulteary
2024/11/21
1930
千兆之上:家庭网络 2.5G 升级实践
预算有限,如何选择能打的笔记本电脑
最近很多粉丝在问我,如何选择电脑的问题以及某某款笔记本怎么样?这个问题我在之间的文章《如何选购一台适合写代码的笔记本电脑》中,对各个参考指标有所表达,不在赘述,详情可以去看下。
马拉松程序员
2022/04/26
7800
预算有限,如何选择能打的笔记本电脑
科研汪4k搞定适合生信分析的笔记本电脑购买攻略~
这个价钱是当时站长能接受的最高价格。就以这个为起点来划分四个档供大家参考。再次注意!不是说设备越好,做分析发文章越厉害!理性消费,从我做起!另外,郑重声明:站长,不是带货的,与以下出现的商家没有任何合作。图片只为了展现样子和型号,买家是否靠谱,建议多平台货比三家,不希望误导大家。
Chris生命科学小站
2023/02/28
5K0
科研汪4k搞定适合生信分析的笔记本电脑购买攻略~
廉价的家用工作站方案:ThinkPad 存储升级及数据迁移
最近,给当台式服务器一样使用了两年的 ThinkPad 做了存储升级和数据迁移,对硬盘也做了额外的散热处理。
soulteary
2023/09/04
3690
廉价的家用工作站方案:ThinkPad 存储升级及数据迁移
突破内存限制:Mac Mini M2 服务器化实践指南
本篇文章,我们聊聊如何使用 Mac Mini M2 来实现比上篇文章性价比更高的内存服务器使用,分享背后的一些小的思考。
soulteary
2024/11/22
2950
突破内存限制:Mac Mini M2 服务器化实践指南
深度学习工作站攒机指南
接触深度学习已经快两年了,之前一直使用Google Colab和Kaggle Kernel提供的免费GPU(Tesla K80)训练模型(最近Google将Colab的GPU升级为Tesla T4,计算速度又提升了一个档次),不过由于内地网络的原因,Google和Kaggle连接十分不稳定,经常断线重连,一直是很令人头痛的问题,而且二者均有很多限制,例如Google Colab一个脚本运行的最长时间为12h,Kaggle的为6h,数据集上传也存在问题,需要使用一些Trick才能达成目的,模型的保存、下载等都会耗费很多精力,总之体验不是很好,不过免费的羊毛让大家撸,肯定会有一些限制,也是可以理解的。
10JQKA
2019/05/15
9.5K2
苹果M1芯片其实没有那么好?英特尔做了套PPT官方反击
2020 年 11 月,苹果正式发布了用于 Mac 的自研电脑芯片 M1,迄今已发布了搭载 M1 芯片的三款新品:MacBook Air、13 英寸 MacBook Pro 和 Mac Mini。许多果粉上手后也连连好评,不管是在各项基准性能测试还是电池寿命方面,新品的表现都很不错。
机器之心
2021/03/15
1.4K0
苹果M1芯片其实没有那么好?英特尔做了套PPT官方反击
廉价的全闪存雷电 NAS 折腾笔记:组网方案的选择
最近用一千五左右的成本,入手了一台便宜的准系统,计划使用它来作为家里第一台全闪存的高速 NAS,来改善在玩模型过程中让人头疼的模型文件传输的效率问题。
soulteary
2023/08/31
5830
家用工作站方案:ThinkBook 14 2023 版
本篇文章聊聊今年双十一,我新购置的家用工作站设备:ThinkBook 14 2023,一台五千元价位,没有显卡的笔记本。我为什么选择它,它又能做些什么。
soulteary
2023/11/09
4710
MacBook Pro 为什么值得我写一篇博文——程序猿使用感悟
研究生生涯伊始,撑过大学四年的 Dell 灵越 N4050 笔记本电脑就再次罢工了,一直想换电脑的冲动终于要付诸行动了,本来准备再换一个性价比比较高的 win 系列笔记本就行了,但是让我意外的是研究生新入学后会发放奖学金....一下子换电脑的资金就富裕了,可选择的余地就更大了。对与苹果电脑的高逼格我是早就心驰神往,但比较高的售价与某些软件兼容性的顾虑一直是我购买的主要障碍,现在钱已经不是问题,剩下的就是考略兼容性以及实用性的问题了,性价比?买苹果就不要考了什么性价比了吧。
流川枫
2018/09/12
21.2K0
MacBook Pro 为什么值得我写一篇博文——程序猿使用感悟
突破内存限制:Mac Mini M2 服务器化实践指南
本篇文章,我们聊聊如何使用 Mac Mini M2 来实现比上篇文章性价比更高的内存服务器使用,分享背后的一些小的思考。
soulteary
2024/11/26
4080
突破内存限制:Mac Mini M2 服务器化实践指南
低成本搭建一台家庭存储服务器:前篇
今年考虑专门搭建一台用于数据备份的机器,一来今年外出的需求比较多,历史的设备已经用了几年了,需要有更新的设备来“接力”;二来也想验证方案的靠谱程度,解决我接触的一些生产环境的需求以及朋友们的问题。
soulteary
2023/03/05
3.5K0
低成本搭建一台家庭存储服务器:前篇
廉价的家庭工作站设备改造记录:苹果垃圾桶(Mac Pro 2013)
最近想分析一些有趣的开放数据集,考虑到综合成本,并且数据不在云端,所以我考虑再入手一台能够搭载大容量内存的设备,来帮助我省心的解决问题。
soulteary
2023/03/05
3.1K0
廉价的家庭工作站设备改造记录:苹果垃圾桶(Mac Pro 2013)
廉价的家庭工作站设备改造记录:苹果垃圾桶(Mac Pro 2013)
最近想分析一些有趣的开放数据集,考虑到综合成本,并且数据不在云端,所以我考虑再入手一台能够搭载大容量内存的设备,来帮助我省心的解决问题。
soulteary
2023/02/04
3.3K0
装在笔记本里的私有云环境:准备篇
接下来我计划写一个小系列,聊聊如何把一个简化过的私有云环境部署在笔记本里,以满足低成本、低功耗、低延时的实验环境。
soulteary
2022/01/24
1.3K0
装在笔记本里的私有云环境:准备篇
家用网络升级实践:低成本实现局部万兆(一)
最近和大家分享了我的一些网络设备升级经历,比如之前写过的《2024 年终,个人设备盘点[1]》中提到的“HomeLab 的存储、计算、网络升级换代” ,以及《千兆之上:家庭网络 2.5G 升级实践[2]》。
soulteary
2024/12/30
6310
家用网络升级实践:低成本实现局部万兆(一)
苹果M1最终形态:1140亿晶体管,超越i9+3090,完全体售价6万
机器之心报道 编辑:泽南、杜伟 苹果 M1 系列芯片最后的一个型号,拿两块 M1 Max 直接拼起来,苹果说它「会改变业界游戏规则」。 今天凌晨,苹果在线上举办了 2022 年春季发布会。会上,苹果推出了很多新品,包括全新苍岭绿色版 iPhone 13 和 13 Pro 系列、A15 和 5G 加持的 iPhone SE 3、搭载 M1 芯片的 iPad Air 5 等。不过,最值得关注的还是 M1 Max 芯片的升级版——M1 Ultra 以及搭载这款芯片的全新 Mac 产品——Mac Studio。
机器之心
2022/03/09
1.1K0
学编程适合买什么类型的电脑?
在大学刚入学的时候,很多小伙伴对于自己是不是需要电脑,需要什么类型的电脑还不是多清楚。
老九君
2021/01/12
2.4K0
20k搞定生信服务器购买、安装与配置攻略~
塔式服务器中Dell完胜其他~ 四、选什么样的配置? 使用云服务器做分析的时候,能使用的最高性能配置就是12核64G+8T的硬盘,至于其他比如显卡:等做深度学习的时候再配也来得及比如SSD:性价比超低,等价钱降下来了再配也来得及比如双路cpu:其实一个就够用了,只要板子有两个接口,以后再配也来得及比如光驱:随机附送,可有可无。等等都是次要的所以下面就是最后的配置塔式服务器机箱+主板:dell poweregde T630CPU:E5 2630V4(10核20线程)内存:64G硬盘:2x4T,dell工业级SAS硬盘列阵卡:H330(管理硬盘的东西)电源:495W dell热插拔电源(考虑发在家里电费问题,就选了个低功率的)其他:都是默认的 五、只有机箱吗?还需要买什么配件? 当然只有机箱,你需要配一个显示器,还有一套鼠标键盘。显示器不用特别好,站长选的是:Dell SP2318H 六、价格 其实,这套配置的议价空间真的不大,网上购买节省的就是因为销售渠道造成的加价,只要找到直销的店都能拿到最低上面那套配置,整机价格:19500元。 显示器赶上了促销价格:1000元。20k的价格,在预算之内,就这样,站长不仅花光了讲课赚的钱,还要还贷。哎~~~~~ 七、运行情况 1、系统选择:站长因为使用centos习惯了,强行让卖家安了个一个centos。没想到的是Centos也有图形界面了,欣慰一。2、转录组分析:云服务器上能做的这个服务器完全胜任,从下载到分析数据可视化,整个过程效率提高20%,欣慰二。3、远程操控与网络:这个对于站长是刚需,值班时候用手机简单操作一下什么是必须要实现的。站长家的宽带是所谓的100M电信光纤。然而,实际使用中下载峰值只有10M/s,没有云服务器使用的时候20M/s的峰值快,能到10M/s也知足了。然而,第一次使用的时候站长几近崩溃,用ascp高速下载峰值只有5M/s,更不爽的是只要下载一开始,全家都不要用网了,看个世界杯都卡死,在不断扎心中,站长绝对找找解决方案,如下:(1)从头找原因,一般电信小区光纤入户都是在一个大局域网下面,分到家里IP都是100.xxx.xxx.xxx这样的,用这个IP你是不能进行远端操作的。另外家里都用路由器,电脑上显示的IP都是192.168.xxx.xxx这样的地址,远程是无法操控的。站长联系了10000,得知电信可以把100局域网IP改成123公网IP,通过路由器设置定向转发,就可以在外网用ssh输入账号密码,登陆自己家里的服务器了。也就是像腾讯云服务器那样实现登陆。欣慰三。
Chris生命科学小站
2023/02/28
6.4K1
20k搞定生信服务器购买、安装与配置攻略~
闲置笔记本变身 Steam OS 游戏主机
这篇文章或许是中文网络第一篇,详细介绍如何在普通 PC 设备上安装 Steam OS 新版本系统,希望能为中文玩家提供一个实用的参考指南。
soulteary
2025/02/05
7140
闲置笔记本变身 Steam OS 游戏主机
推荐阅读
相关推荐
千兆之上:家庭网络 2.5G 升级实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档