一次线上mysql 调优 ,join 的调优,索引优化(Block Nested Loop)

news2024/11/24 6:03:07

原因:
某接口调用十分缓慢,通过 Explain 发现是SQL问题
在这里插入图片描述

FROM
	orderInfo o
LEFT JOIN orderDetail d ON
	o.orderCode = d.orderCode
LEFT JOIN user u ON
	o.userId = u.userId
LEFT JOIN product p ON
	d.productCode = p.productCode
LEFT JOIN adminUser au ON
	u.adminId = au.id
LEFT JOIN domain_redemption dr on
	dr.orderCode = o.orderCode

可以看到,在Join连接时,出现了BNL查询,BNL出现是因为,JOIN连接时 dr表也就是 domian_redemption 被驱动的表上没出现可用的索引。

个人解决方法:
在对应的连接字段上,既dr的orderCode字段,内表加上索引,再次执行Explain可以发现,BNL已经消失,走了索引,既使用了INLJ的方式
在这里插入图片描述

在Mysql的实现中,Nested-Loop Join有3种实现的算法:

Simple Nested-Loop Join:SNLJ,简单嵌套循环连接
Index Nested-Loop Join:INLJ,索引嵌套循环连接
Block Nested-Loop Join:BNLJ,缓存块嵌套循环连接

在选择Join算法时,会有优先级,理论上会优先判断能否使用INLJ、BNLJ:
Index Nested-LoopJoin > Block Nested-Loop Join > Simple Nested-Loop Join

Simple Nested-LoopJoin

1.简单嵌套循环连接实际上就是简单粗暴的嵌套循环,如果table1有1万条数据,table2有1万条数据,那么数据比较的次数=1万 * 1万 =1亿次,这种查询效率会非常慢。
2.所以Mysql继续优化,然后衍生出Index Nested-LoopJoin、Block Nested-Loop Join两种NLJ算法。在执行join查询时mysql会根据情况选择两种之一进行join查询。
在这里插入图片描述

Index Nested-LoopJoin(减少内层表数据的匹配次数)

1.索引嵌套循环连接是基于索引进行连接的算法,索引是基于内层表的,通过外层表匹配条件直接与内层表索引进行匹配,避免和内层表的每条记录进行比较, 从而利用索引的查询减少了对内层表的匹配次数,优势极大的提升了 join的性能:

原来的匹配次数 = 外层表行数 * 内层表行数
优化后的匹配次数= 外层表的行数 * 内层表索引的高度

在这里插入图片描述

使用场景:只有内层表join的列有索引时,才能用到Index Nested-LoopJoin进行连接。
由于用到索引,如果索引是辅助索引而且返回的数据还包括内层表的其他数据,则会回内层表查询数据,多了一些IO操作。

Block Nested-Loop Join(减少内层表数据的循环次数)

使用join Buffer 优化了 SNLJ
在这里插入图片描述
首先变量join_buffer_size用来控制Join Buffer的大小,调大后可以避免多次的内表扫描,从而提高性能。也就是说,当MySQL的Join有使用到Block Nested-Loop Join,那么调大变量join_buffer_size才是有意义的。而前面的Index Nested-Loop Join如果仅使用索引进行Join,那么调大这个变量则毫无意义。

  • join_buffer_size的默认值是256K

当join_buffer_size大小不够时,会去清空joinbuffer,再从驱动表读取,与内表进行匹配,因此可以调大joinbuffersize,减少block的读取次数

设置join buffer size 的语句, 单位得是字节,既 如果想设置512K则语句为

SET GLOBAL join_buffer_size = 524288;

在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤,过滤完成之后,计算参与 join 的各个字段的总数据量,数据量小的那个表,就是“小表”,应该作为驱动表。

INLJ的进一步优化 Batched Key Access Join

Index Nested-Loop Join虽好,但是通过辅助索引进行链接后需要回表,这里需要大量的随机I/O操作。若能优化随机I/O,那么就能极大的提升Join的性能。为此,MySQL 5.6推出了Batched Key Access Join,该算法通过常见的空间换时间,随机I/O转顺序I/O,以此来极大的提升Join的性能。
在使用BKA算法前,先得介绍mrr算法
mrr的优化在于,并不是每次通过辅助索引读取到数据就回表去取记录,而是将其rowid给缓存起来,然后对rowid进行排序后,再去访问记录,这样就能将随机I/O转化为顺序I/O,从而大幅地提升性能。

如果要使用 BKA 优化算法的话,你需要在执行 SQL 语句之前,先设置

set optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';

开启后,再explain一下,可以发现 已经开启 batched key acess join;
在这里插入图片描述

参考 JOIN 优化文章:
https://www.cnblogs.com/starhu/p/6418842.html
https://www.cnblogs.com/starhu/p/6418833.html
https://www.cnblogs.com/starhu/p/6418824.html

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

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

相关文章

Linux之打包压缩

1、参考 11-文件压缩与打包 linux tar压缩排除指定文件夹 2、打包与压缩 在windows上似乎打包和压缩是同一个东西,大家都明白你的意思,实际上是打包和压缩是两个过程,只不过常用zip压缩一站式解决了。 打包:就是将文件夹或多个…

《终身成长》笔记七——建设性的批评

目录 总结 经典摘录 我们能做什么 成长型思维模式与马上行动有异曲同工之妙 改变孩子的思维模式 两种思维模式对比 总结 《终身成长》是卡罗尔德韦克的代表作,在这部作品中,她以通俗易懂的笔触总结了自己对人类两种思维模式的研究。也许因为思维模…

mysq的约束学习

第13章_约束 1. 约束(constraint)概述 1.1 为什么需要约束 数据完整性(Data Integrity)是指数据的精确性(Accuracy)和可靠性(Reliability)。它是防止数据库中存在不符合语义规定的数据和防止因错误信息的…

鸿蒙Hi3861学习十五-Huawei LiteOS-M(Socket客户端)

一、简介 在网络编程的时候,不管是客户端还是服务端,都离不开Socket。那什么是Socket,这里做个简单介绍。详细的内容,可以参考这篇文章:WIFI学习一(socket介绍)_wifi socket_t_guest的博客-CSDN…

ChatGPT发展报告:原理、技术架构详解和产业未来(附下载)

今年12月1日,OpenAI推出人工智能聊天原型ChatGPT,再次赚足眼球,为AI界引发了类似AIGC让艺术家失业的大讨论。 据报道,ChatGPT在开放试用的短短几天,就吸引了超过 100 万互联网注册用户。并且社交网络流传出各种询问或…

其他类型的CMOS逻辑门

1.CMOS与非门 电路结构如图所示 如图所示,T1、 T3为两个串联的PMOS, T2、 T4为两个并联的NMOS. A、B有一个为“0”时,T2、 T4至少有一个截止, T1、 T3至少有一个导通,故输出为高电平,Y=1. A、…

用Colab免费部署AI绘画云平台Stable Diffusion webUI

Google Colab 版的 Stable Diffusion WebUI 1.4 webui github 地址:https://github.com/sd-webui/stable-diffusion-webui 平台搭建 今天就来交大家如果来搭建和使用这个云平台。 第一步: 打开链接 https://colab.research.google.com/github/altryne/sd-webu…

求最大字段和(穷举法、动态规划、分治法)

目录 1、案例要求2、算法设计与实现2.1 穷举法2.1.1 算法设计思路2.1.2 代码实现 2.2 动态规划2.2.1 算法设计思路2.2.2 实现代码 2.3 分治法2.3.1 算法实现思路2.3.2 代码实现 3、总结 1、案例要求 给定由n个整数(可能为负整数)组成的序列a1,a2,…,an&…

菜鸟对原型链的理解

1.什么是原型 函数下的prototype属性,是个指针,指向的对象就是原型 2.什么是原型链 很多个原型连接起来就是一条链了。 function Person() { } var test new Person(); 当我们new一个构造函数是,实例对象(test)&a…

Windows平台上的5种敏捷软件开发(过程)模型

我是荔园微风,作为一名在IT界整整25年的老兵,今天总结一下Windows平台上的5种敏捷软件开发(过程)模型。 说到这个问题,你必须先知道除了敏捷模型还有没有其他什么模型?同时要比较模型的区别,首先还要看看什么叫软件开…

文件权限-chmod命令 – 改变文件或目录权限

Linux chmod命令 – 改变文件或目录权限 在Linux系统中,每个文件和目录都有自己的权限属性,这些属性包括读、写、执行等权限。通常情况下,只有文件的所有者和管理员可以设置文件权限,而普通用户只能管理自己文件的权限。为了更好…

数据结构总结5:堆

后续会有补充 堆 堆是一种数据结构,总是一棵完全二叉树,是使用数组存储的,是非线性的;并且要求树中所有的父亲都小于等于孩子(小根堆)/树中所有的父亲都大于等于孩子(大根堆)不一定…

人工智能基础部分16-神经网络与GPU加速训练的原理与应用

大家好,我是微学AI,今天给大家介绍一下人工智能基础部分16-神经网络与GPU加速训练的原理与应用,在深度学习领域,神经网络已经成为了一种流行的、表现优秀的技术。然而,随着神经网络的规模越来越大,训练神经…

Linux下部署Samba服务(实现windows和linux共享)

关于Linux和Windows系统之间的文件传输,很多人选择使用FTP,相对较安全,但是有时还是会出现一些问题,比如上传文件时,文件名莫名出现乱码,文件大小改变等问题。相比较来说,使用Samba作为文件共享…

Midjourney会员充值教程

本教程收集于:AIGC从入门到精通教程 Midjourney会员充值教程 目录 一、 打开会员订阅页面 二、 选择您需要订阅的会员

8. 机器学习系统设计

假设你想建立一个垃圾邮件分类器,通过监督学习来构造一个分类器来区分垃圾邮件和非垃圾邮件。为了应用监督学习,首先要想的就是:如何来表示邮件的特征向量x,通过特征向量x和分类标签y,我们就能训练一个分类器&#xff…

(十六)数据编辑——图形编辑②

数据编辑——图形编辑② 目录 数据编辑——图形编辑②1.5线要素的延长和裁剪1.5.1线要素延长1.5.2线要素裁剪 1.6要素的变形与缩放1.6.1要素变形操作1.6.2要素缩放操作 1.7要素结点的编辑1.7.1添加结点1.7.2删除结点1.7.3移动结点 1.5线要素的延长和裁剪 单击编辑器下拉菜单&a…

【Nvidia Jetson Xavier NX/AGX/NANO】上用docker跑pytorch等cv推理应用

Nvidia Jetson Xavier NX/AGX docker WHY镜像地址使用方法docker常用命令备忘jtop安装关于保存容器镜像关于使用dockerfile构建关于映射外部路径让容器访问外部文件关于性能 WHY 在jetson上使用docker跑opencv和pytorch其实主要是要找对镜像,docker官方的hub里并没…

linux0.12-9-5-ramdisk.c

1、 需要配合其他代码一起看,才能有深刻的理解。 [432页] 9-5 ramdisk.c程序 9-5-1 功能描述 本文件是内存虚拟盘(Ram Disk)驱动程序,由Theodore Ts’o编制。虚拟盘设备是一种利用物理内存来模拟实际磁盘存储数据的方式。其目的主要是为了提高对&quo…

Conda 安装Pytorch

1、conda 切换虚拟环境 activate 虚拟环境名称 C:\Windows\System32>activate python310 温馨提示:查询虚拟环境列表 conda env list C:\Windows\System32>conda env list # conda environments: # base D:\anaconda3 python310 …