【数据库】join SQL语句原理优化

news2024/12/19 21:58:08

背景

在实际的开发中,业务相关表都是通过uid或者一个可以标记业务领域的一个属性转换成的字段进行关联的,但是对于一些后续的业务,比如数据分析、下游系统使用、金融对账等业务,需要进行多表联查,之前实际生产的时候就见过对账文件使用6、7个表进行left join进行联查。而且大多数表都是千万级的表、虽然添加索引可以从一定程度上提升开发效率。但是具体如何优化,其实还是需要了解一下join具体的算法。

SQL

  • left join
  • right join
  • inner join
  • full join

join 算法

创建一个表 t1 (id,a,b) a字段创建索引,(插入100条数据) 然后创建一个相同的表B (插入1000条数据)

Simple Nested-Loop Join:SNLJ,简单嵌套循环连接

EXPLAIN SELECT * FROM t1 STRAIGHT_JOIN t2 ON t1.a = t2.b;

由于t2.b没有索引,所以会先查询t1的每一行数据,然后全标扫描t2的表进行匹配
所以执行的总行数是100 * 1000 = 10W行数据,但是实际上这个算法比较笨重,MySQL选择了另外的算法,BNLJ算法。

Index Nested-Loop Join:INLJ,索引嵌套循环连接

EXPLAIN SELECT * FROM t1 STRAIGHT_JOIN t2 ON t1.a = t2.a;
在这里插入图片描述
其中STRAIGHT_JOIN的作用固定SQL join的方式,因为MySQL可能会进行Join 优化,不一定按照SQL书写格式进行执行。因为t1.a和t2.a都创建的有索引,所以会走索引a
1.从t1表中获取一条数据,然后从t2中获取所有的数据进行遍历。
2.如果相等,则直接将数据放入结果集中,不想等,重新执行。
这个过程其实SNLJ算法,类似于一个双层的for循环。 Index Nested-Loop Join

流程图
在这里插入图片描述
扫描行数
1.T1表100行数据 扫描100行
2.T2表1000行数据 扫描101行,一共是200行。

Block Nested-Loop Join:BNLJ,缓存块嵌套循环连接

EXPLAIN SELECT * FROM t1 STRAIGHT_JOIN t2 ON t1.a = t2.b;

在这里插入图片描述
上面我们分析了,MySQL并没有走SNLJ算法,而是使用了join buffer 进行处理。那么具体的流程是什么呢
1.先将t1表中的数据拉去到join_buffer缓存中,然后获取t2的所有数据,从join_buffer缓存中获取所有数据,一条一条从t2中匹配,最后汇总结果集。

执行条数:
T1+T2 总数据1100条,因为数据在join_buffer中数据是无序的,需要在内存中进行100*1000次的判断,但是在内存的判断10W次,但是内存判断是速度是很快的。
在这里插入图片描述
1.join_buffer join_buffer_size 设定的,默认值是 256k,如果超过这个范围就是分段放,也就是block的名称又来。

是否可以使用join呢
1.如果可以使用 INLJ算法,说明字段都是走了索引,其实执行效率还是可以的。
2.如果BNLJ算法,大数据量下,其实建议不要使用join操作。

选择什么表做驱动表呢
如果是 Index Nested-Loop Join 算法,应该选择小表做驱动表;
如果是 Block Nested-Loop Join 算法:
在 join_buffer_size 足够大的时候,是一样的;
在 join_buffer_size 不够大的时候(这种情况更常见),应该选择小表做驱动表。

如何优化

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

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

相关文章

【安卓开发】内容提供器

内容提供器实现了不同程序之间实现数据共享的功能。 7.2 运行时权限 安卓6.0版本后引入了运行时权限 每个权限都属于一个组&#xff0c;授权了其中一个&#xff0c;一个组内的权限都将会被授权。 测试代码 // AndroidManifest.xml中加入以下代码 <uses-permission andr…

魔改hustoj源码使其支持显示队名和队员及女队标志

0. 起因&需求 本文涉及到的开源项目Github地址&#xff1a;https://github.com/zhblue/hustoj 事件的起因是&#xff0c;计算机学院要举办一个院级的ACM比赛&#xff0c;然后捏… 老师给我提了一个需求&#xff0c;就是能不能把比赛排行榜显示的队名下标注对应的队员&…

光栅化Triangles(笔记)

field of view (可见区域) 该角度越大,需要透视投影的角度越大,成像显示的内容越多 有Y值,则可得出成像范围 屏幕: 典型的光栅处理设备所有像素都被表示为x,y坐标轴形式 3D方块成像步骤: 先将其所在平面化为 与屏幕等长等宽的形式: 如何将一个三角形拆成像素&#xff1f;采样…

C++学习笔记-2

C学习笔记-2输入/输出控制----I/O流命名空间的定义及使用string类型函数改进域解析符::扩大全局变量的作用域形式参数可带有默认值函数重载引用的定义与应用引用的概念及使用引用作为形式参数引用与指针的比较引用作为返回值动态内存空间用new申请动态内存空间用delete释放动态…

unicloud的aggregate聚合查询时间戳转日期

我特么不知道看了这个帖子几百遍才看明白到-----》unicloud数据库中&#xff0c;聚合操作如何操作时间戳&#xff1f; - DCloud问答 自己淋过雨老想着为别人撑伞&#xff0c;可怜我这35岁的老人家&#xff0c;给我去点关注&#xff01;&#xff01;&#xff01;&#xff01;&a…

centos上cliskhouse的安装记录

clickhouse是由俄罗斯Yandex公司开发的列式存储数据库&#xff0c;于2016年开源&#xff0c;clickhouse的定位是快速的数据分析&#xff0c;对于处理海量数据的情况性能非常好&#xff0c;在网上也有很多测试的案例&#xff0c;在大数据的情况下性能远超过其他数据库&#xff0…

ThreadLocal原理、结构、源码解析

文章目录一、Thread简介1.什么是ThreadLocal2.为什么要是用ThreadLocal2.1Synchronized、Lock保证线程安全2.2ThreadLocal保证线程安全3.ThreadLocal和Synchronized的区别二、ThreadLocal原理1.Thread抽象内部结构2.ThreadLocal源码2.1Thread、ThreadLocal、ThreadLocalMap、En…

行业观察 | 内存接口芯片和CXL协议

本文对内存接口芯片的概念和CXL协议进行不完全总结。 更新&#xff1a;2022 / 02 / 25 行业观察 | 内存接口芯片背景内存接口芯片概念趋势CXL 协议背景 DRAM 内存基本被国外巨头 三星、美光 等内存模组制造商垄断&#xff0c;合计市场占有率超过 90%。 内存接口芯片 概念 什…

【Android】Android开发笔记(一)

【Android】Android开发笔记&#xff08;一&#xff09; 在Android Studio中import module和delete moduleimport moduledelete moduleAndroid Studio中App&#xff08;Module&#xff09;无法正常运行在实机上测试App一些基本概念App的工程结构结语在Android Studio中import m…

Leetcode Solutions - Part 2

1. Two Sum 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按…

7-vue-1

谈谈你对MVVM的理解 为什么要有这些模式&#xff0c;目的&#xff1a;职责划分、分层&#xff08;将Model层、View层进行分类&#xff09;借鉴后端思想&#xff0c;对于前端而已&#xff0c;就是如何将数据同步到页面上 MVC模式 代表&#xff1a;Backbone underscore jquer…

【DIY Arduino基于RC气垫船】

在本教程中,我们将学习如何构建基于 Arduino 的 RC 气垫船。我将向您展示构建它的整个过程,从设计和3D打印气垫船部件(包括螺旋桨)开始,到连接电子元件和对Arduino进行编程。 您可以观看以下视频或阅读下面的书面教程。 视频地址:https://www.youtube.com/watch?v=2XIG…

二叉平衡树(C++)

背景&#xff1a; 二叉平衡树&#xff0c;就是根据二叉搜索树进行优化&#xff0c;让其速度更加的快&#xff0c;如果读者没有学过二叉搜索树&#xff0c;可以前往以下链接查看资料&#xff1a;http://t.csdn.cn/cCDQDhttp://t.csdn.cn/cCDQD 二叉搜索树的缺陷&#xff1a; 在…

【Spark分布式内存计算框架——Spark Streaming】1. Streaming 概述(上)Streaming 应用场景、Lambda 架构

前言 在很多实时数据处理的场景中&#xff0c;都需要用到流式处理&#xff08;Stream Process&#xff09;框架&#xff0c;Spark也包含了两个完整的流式处理框架Spark Streaming和Structured Streaming&#xff08;Spark 2.0出现&#xff09;&#xff0c;先阐述流式处理框架&…

Linux--TCP编程--0216 17

观前提示&#xff1a;本篇博文的一些接口需要前几篇博文实现的 线程池的实现Liunx--线程池的实现--0208 09_Gosolo&#xff01;的博客-CSDN博客 线程池的单例模式Linux--线程安全的单例模式--自旋锁--0211_Gosolo&#xff01;的博客-CSDN博客 1.TCP编程需要用的接口 创建 sock…

【数据挖掘】EDA——以2022雪浪算力开发者大赛数据为例

作者简介&#xff1a;重庆大学22级研一&#xff0c;研究方向&#xff1a;时空数据挖掘、图神经网络。目前正在学习大数据、数据挖掘等相关知识&#xff0c;希望毕业后能找到数据相关岗位。 前言 之前写了一个比赛复盘&#xff08;【竞赛复盘】2022雪浪算力开发者大赛——阀体异…

Python脚本之准备测试环境的用户数据

本文为博主原创&#xff0c;未经授权&#xff0c;严禁转载及使用。 本文链接&#xff1a;https://blog.csdn.net/zyooooxie/article/details/127645678 这期是讲述下 我准备测试环境用户数据的经历。 【实际这篇博客推迟发布N个月】 个人博客&#xff1a;https://blog.csdn.…

【读书笔记】《深入浅出数据分析》第三章 寻找最大值

目录 一&#xff0c;Excel却是最基础、最高频、最有机会展示的一款数据分析工具二&#xff0c;作为数据工作者&#xff0c;实际工作中&#xff0c;不管用不用的上&#xff0c;至少到达会的水准1&#xff0c;常用函数2&#xff0c;透视表3&#xff0c;可视化4&#xff0c;数据分…

【RabbitMQ笔记04】消息队列RabbitMQ七种模式之发布订阅模式(Publish/Subscribe)

这篇文章&#xff0c;主要介绍消息队列RabbitMQ七种模式之发布订阅模式&#xff08;Publish/Subscribe&#xff09;。 目录 一、发布订阅模式 1.1、Exchange交换机 &#xff08;1&#xff09;什么是Exchange交换机呢&#xff1f;&#xff1f;&#xff1f; &#xff08;2&am…

数据结构与算法----问答2023

1、什么是哈希表&#xff1f;如何解决碰撞&#xff1f; 哈希表&#xff08;Hash Table&#xff09;&#xff0c;也称为散列表&#xff0c;是一种用于实现字典&#xff08;键值对&#xff09;数据结构的数据结构。它将键映射到哈希表中的一个索引&#xff08;桶&#xff09;来保…