MySQL数据库调优————JOIN优化

news2024/9/29 19:18:28

JOIN的种类

LEFT JOIN

在这里插入图片描述

SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key

求的是A所有的数据以及A与B的交集

RIGHT JOIN

在这里插入图片描述

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key

求的是B所有的数据以及A和B的交集

INNER JOIN

在这里插入图片描述

SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key

求的是A和B的交集

OUTER JOIN

在这里插入图片描述

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key

求的是A和B所有的数据

LEFT EXCLUDING JOIN

在这里插入图片描述

SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

求的是A除去和B的交集的数据

RIGRT EXCLUDING JOIN

在这里插入图片描述

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL

求的是B除去和A的交集的数据

OUTER EXCLUDING JOIN

在这里插入图片描述

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL

求的是A和B除去交集部分的所有数据

CROSS JOIN(笛卡尔连接)

SELECT <select_list>
FROM Table_A A
CROSS JOIN Table_B B

求的是A和B的任意联接的数据,数量是A表行数和B表行数的乘积。如果加上了ON语句,则等同于INNER JOIN。

JOIN算法

Nested-Loop Join(NLJ:嵌套循环JOIN)

TableJoin Type
t1range
t2ref
t3ALL

计算过程:

for each row in t1 matching range{
	for each row in t2 matching reference key{
		for each row in t3{
			if row satisfies join conditions,send to client
		}
	}
}

先从t1中查找出符合要求的数据,然后for循环遍历这些数据;在循环体里查询出t2表中符合要求的数据,并使用key(ON语句用来连接的字段)进行匹配;因为t3是ALL,全表扫描,所以拿t3
表中所有的数据进行匹配,如果满足ON条件,则返回给客户端。因为是嵌套循环进行计算的,所以该算法效率并不高。
假设。第一层循环有100条数据,第二层循环有100条数据,t3表有100条数据,那么总的循环次数就是100100100=1000000。

Block Nested-Loop Join(BNLJ:块嵌套循环JOIN)

还是采用上述三张表进行join查询
计算过程:

for each row in t1 matching range {
  for each row in t2 matching reference key {
    store used columns from t1, t2 in join buffer 
    if buffer is full {
      for each row in t3 {
        for each t1, t2 combination in join buffer {
          if row satisfies join conditions,
          send to client
        }
      }
      empty buffer
    }
  }
}
 
if buffer is not empty {
  for each row in t3 {
    for each t1, t2 combination in join buffer {
      if row satisfies join conditions,
      send to client
    }
  }
}

还是先查询t1中符合条件的数据,然后for循环遍历;在循环体里查询出t2表中符合要求的数据,并使用key(ON语句用来连接的字段)进行匹配;将t1,t2需要用到的数据存到join buffer(连接缓存)中,一直往join buffer中存放数据,当join buffer存满时,会与t3进行匹配,将符合要求的数据返回给客户端,并将缓存清空,继续下一次循环。当循环结束,判断缓存是否为空,不为空则将剩余的数据与t3进行匹配,将符合要求的数据返回给客户端。

BNLJ扫描次数计算公式

(S * C)/join_buffer_size + 1

  • S:缓存的t1/t2表的一行数据大小
  • C:缓存的行数
  • join_buffer_size:join buffer的大小

假设,第一层有100条数据,第二层有100条数据,join buffer中可以存放t1/t2数据为100条,则需要100 * 100 / 100 + 1=101,需要扫描101次。

使用join buffer的条件

  • 连接类型是ALL、index或range
  • 第一个nonconst table不会分配join buffer,即使类型是ALL、index或range
  • join buffer只会缓存需要的字段,而非整行数据
  • 可通过join_buffer_size变量设置join buffer的大小
    • show variables like ‘join_buffer_size’;查看当前join buffer大小
    • set join_buffer_size = XXXX; 设置当前session的join buffer的大小
    • set global join_buffer_size = XXXX;设置全局join buffer的大小
  • 每个能被缓存的join都会分配一个join buffer,一个查询可能拥有多个join buffer
  • join buffer在执行联接之前会分配,在查询完成后释放

Batch Key Access Join(BKA:批量键值访问)

  • MySQL5.6引入
  • BKA的基石:Multi Range Read(MRR)

什么是MRR

在一次范围查询中,如果未使用主键索引,那么查询到的数据集在查找是可能会伴随大量的随机IO,因为我们的数据是按照主键索引进行排列的;我们知道,非主键索引存储的是主键而不是具体的数据,MRR会在查询到数据集后,根据主键进行一次排序,然后再根据排序后的主键顺序去查找数据,从而将随机IO转换为了顺序IO。MRR的核心就是:将随机IO转换成顺序IO,从而提升性能。

MRR参数

  • optimizer_switch的子参数
    • mrr:是否开始mrr,on开启,off关闭
    • mrr_cost_based:表示是否要开启基于成本计算的MRR
  • read_rnd_buffer_size:指定mrr缓存大小

BKA流程

上述的NLJ和BNLJ两种算法都是每次进行IO查找,而BKA则是将外层循环计算的结果存入join buffer中,然后使用t3表索引去跟join buffer中的数据匹配,将一批的数据进行MRR基于主键排序,然后再去进行顺序IO查找。

BKA参数

  • optimizer_switch的子参数
    • batched_key_access:on开启,off关闭

HASH JOIN

  • MySQL8.0.18引入,用来替代BNLJ
  • join buffer缓存外部循环的hash表,内层循环遍历时到hash表匹配
SELECT given_name,country_name 
FROM persons JOIN countries 
ON persons.country_id = countries.country_id;

在构建阶段,拿countries表的country_id构建了一张hash表存放在了内存;在探测阶段,拿persons表的country_id计算hash然后到上一步构建的hash表中进行匹配;另外,在内存存放不下第一步构建的hash表时,会把hash表存放到磁盘。

HASH JOIN注意点

  • MySQL8.0.18才引入hash join,且有很多限制,比如不能作用于外连接,比如left join/right join等等。从8.0.20开始,限制少了很多,建议用8.0.20或更高版本。
  • 从MySQL8.0.18开始,hash join的join buffer时递增分配的,意味着,你可以为join_buffer_size设置比较大的值。该版本中,如果你使用了外连接,外连接没法用hash join,此时join_buffer_size会按照你设置的值直接分配内存。因此join_buffer_size还是得谨慎设置。从该版本开始,BNLJ已被删除,用hash join替代了BNLJ。

JOIN优化

驱动表 vs 被驱动表

  • 外层循环的表是驱动表,内层循环的表是被驱动表

JOIN调优原则

  • 用小表驱动大表
    • 一般无需人工考虑,关联查询优化器会自动选择最优的执行顺序
    • 如果优化器没有进行优化,可使用STRAIGHT_JOIN
  • 如果有where条件,应该要能够使用索引,并尽可能的减少外层循环的数据量
  • join的字段尽量创建索引
  • 尽量减少扫描的行数
  • 参与join的表不要太多
    • 阿里编程规约建议不超过3张
  • 如果被驱动表的join字段无法使用索引,且内存较为充足,可以考虑把join_buffer_size设置的大一些

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353520.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx 新增模块 http_image_filter_module 来实现动态生成缩略图

前言 通过 nginx 的 HttpImageFilterModule 模块裁剪过大的图片到指定大小&#xff0c;这个nginx自带的模块是默认关闭的&#xff0c;所以需要重新编译nginx加上此模块。 一、编译 nginx 1.查看 nginx 模块 由于nginx 是之前装好的&#xff0c;这里需要先看一下是否安装了H…

Sentinel简单使用

目录 1.官网 2.主要作用 3.安装启动 3.功能详细 3.1实时监控 3.2 簇点链路 3.3流控规则 3.4熔断规则 3.4热点key限流 3.5系统规则 4.SentinelResource注解解释 1.官网 gitHub GitHub - alibaba/Sentinel: A powerful flow control component enabling reliability…

尚医通 (十六)搭建平台用户系统前端环境 | 用户平台首页数据

目录一、服务端渲染技术NUXT1、什么是服务端渲染2、什么是NUXT二、NUXT环境初始化1、下载压缩包2、解压3、修改package.json4、修改nuxt.config.js5、在命令提示终端中进入项目目录6、安装依赖7、测试运行8、NUXT目录结构9、封装axios10、引入element-ui三、首页静态数据整合1、…

Docker镜像发布到阿里云和私有库

目录 一、Docker镜像 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;Docker镜像加载原理 &#xff08;三&#xff09;镜像分层结构优势 &#xff08;四&#xff09;重点理解 &#xff08;五&#xff09;docker commit操作实例 &#xff08;六&#xff09;总…

如何解决nas无公网问题,实现kodbox可道云内网映射外网访问

目前&#xff0c;市面上有很多NAS产品&#xff0c;如群晖、威联通以及华硕NAS等&#xff0c;它们都自带提供了一些基础的文件管理功能&#xff0c;有的也可以直接在NAS上使用文件管理的应用程序。 kodbox可道云是一个基于 Web 技术的私有云和在线文件管理系统&#xff0c;有着…

考了PMP证后工资大概是多少 ?(含pmp资料)

这个岗位的不同还有每个公司的薪资也是不一样的&#xff0c;具体的数字肯定是没有的&#xff0c;但大概的比例还是有的&#xff0c;据PMI调查&#xff0c;在获得PMP证书的人当中&#xff0c;在PMP认证一年后&#xff0c;年薪有所增长的比例为66%&#xff0c;上涨幅度主要集中在…

抓包工具Charles(二)-移动端APP抓包(设置手机代理、安装证书)

安装好Charles之后&#xff0c;还只能捕获电脑的接口请求想要抓取移动设备的APP还需要设置代理、安装证书。 文章目录一、抓包原理二、手机设置网络代理1、 查看电脑的IP地址&#xff08;local IP address&#xff09;2、设置手机网络代理&#xff08;1&#xff09;iOS设备&…

美团:某动态线程池框架是官方开源的么?

大家好&#xff0c;我是马称。 最近&#xff0c;有很多同学在微信上问我这么一个问题&#xff1a; Hippo4j 动态线程池框架是美团开源的么&#xff1f; 类似于这样的问题还挺多&#xff0c;在这里统一回复下&#xff1a; 美团官方并没有开源任何关于动态线程池的框架。 美…

【深度学习】多分类问题和多标签分类问题

上一章——激活函数 文章目录什么是多分类问题Softmax贝叶斯公式softmax的损失函数多标签分类问题什么是多分类问题 在之前的课程中&#xff0c;我们学习了二分问题&#xff0c;二分问题中的所有数据会被分类为0和1&#xff08;或者Ture和False&#xff09;两种输出标签。但是…

Java_小项目书城

1.概述 书城的基本功能&#xff1a; 展示书籍上新书籍下架书籍退出应用 书城项目所涉及到的知识点&#xff1a; 用户交互–键盘录入分支结构&#xff0c;循环结构面向对象的思维&#xff0c;封装对象集合的使用 2.菜单的编写 这部分代码就是读取用户键盘的录入&#xff0…

Qt线程池

目录1、线程池是什么&#xff1f;2、Qt线程池2.1、用法例程2.2、线程池对性能的提升2.3、运行算法单线程写法线程池写法1、线程池是什么&#xff1f; 线程池是一种线程使用模式&#xff0c;它管理着一组可重用的线程&#xff0c;可以处理分配过来的可并发执行的任务。 线程池设…

2023最新一线大厂Java八股文强势开源,整整8w字,711页内容

前言 大家都知道每年的3月和4月都是互联网大厂疯狂招人的黄金期&#xff0c;也就是程序员的黄金跳槽期&#xff0c;所以被称为金三银四。 无论你是刚出校园大门的菜鸟&#xff0c;还是对跳槽蓄谋已久的老手&#xff0c;都会在这个时候找到新工作和迎来晋升涨薪的最佳时机。 而…

1.InfluxDB简介与安装

InfluxDB简介 InfluxDB是一个时序性数据库&#xff0c;适用场景数据分析&#xff0c;IoT设备数据采集&#xff0c;监控告警等。InfluxDB是采用GO语言编写&#xff0c;底层提供了大量的HTTP协议的API 其他语言的SDK都采用访问HTTP接口的形式对InfluxDB进行操作 InfluxDB官方一…

WPF学习:Slider — 冒泡显示值

想做一个下图所示的Slider&#xff0c;以冒泡的方式显示其Value值&#xff0c;该怎么做呢&#xff1f; 功能要求&#xff0c;当鼠标放在滑块上的时候&#xff0c;冒“泡”显示值&#xff1b;当滑块移动的时候&#xff0c;“泡”跟随移动。 看似简单的功能&#xff0c;但要完美…

扬帆优配“数字经济+实体经济”融合发展,行业增长空间大!

组织以为&#xff0c;数字经济已经逐步成为工业商场和资本商场的共同主题。 2月16日&#xff0c;国家发改委在《求是》杂志发表文章《努力推进经济完成质的有效提升和量的合理增加》。文章指出要加速开展数字经济&#xff0c;加速实施“东数西算”等重大工程&#xff0c;推进数…

计算机网络笔记(四)—— 数据链路层

点对点协议PPP 目前使用最广泛的点对点数据链路层协议 由以下三个部分构成&#xff1a; PPP工作状态 媒体接入控制 主要解决共享信道的协调问题 静态划分信道 复用&#xff1a;通过一条物理线路同时传输多路用户的信号 频分复用&#xff08;FDM&#xff09;&#xff1a;占用…

DataEase 制作数据可视化大屏经验分享

前言 DataEase 简介 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务的改进与优化。DataEase 支持丰富的数据源连接&#xff0c;能够通过拖拉拽方式快速制作图表&#xff0c;并可以方便地与他人分享。 更多详细介…

ChatGPT及相关产品体验与研究

ChatGPT及相关产品体验与研究 我的Github博客仓库链接&#xff1a;ChatGPT及相关产品体验与研究 - Github 一、ChatGPT介绍 1. ChatGPT概述 一句话描述ChatGPT&#xff1a;一个能够通过对话得到你想要的答案的聊天机器人。 ChatGPT 是由 OpenAI 开发的一种基于深度学习的自然…

SPI简介与实例分析

SPI简介 SPI 协议是由Motorola提出的通讯协议 (Serial Peripheral Interface) &#xff0c;是一种高速全双工的串行通信总线。 SPI 通讯使用 3 条总线 &#xff1a;SCK、 MOSI、 MISO &#xff0c;以及若干片选线(SS、CS、NSS)。 主机要和哪个从机通信&#xff0c;就把对应的…

看板项目管理使用指南

作为一种项目管理方法&#xff0c;看板涉及创建列出任务详细信息的可视化卡片&#xff0c;并将它们组织到代表生产过程不同阶段的白板列表中。 今天&#xff0c;看板已经从工厂的白板发展到了我们电脑屏幕上的数字看板应用程序形式。现在的看板项目管理方法可帮助团队管理编辑…