广告
返回顶部
首页 > 资讯 > 数据库 >浅谈mysql join底层原理
  • 759
分享到

浅谈mysql join底层原理

mysqljoin底层原理mysqljoin 2022-05-30 06:05:18 759人浏览 八月长安
摘要

目录join算法驱动表和非驱动表的区别1、Simple Nested-Loop Join,简单嵌套-无索引的情况2、Index Nested-Loop Join-有索引的情况3、Block Nested-Loop J

目录
  • join算法
  • 驱动表和非驱动表的区别
    • 1、Simple Nested-Loop Join,简单嵌套-无索引的情况
    • 2、Index Nested-Loop Join-有索引的情况
    • 3、Block Nested-Loop Join ,join buffer缓冲区
  • 缓冲区大小
    • 数据量大的表和数据量小的表如何选择连接顺序
      • 细节

        join算法

        Mysql只支持一种join算法:Nested-Loop Join(嵌套循环连接),但Nested-Loop Join有三种变种:

        • Simple Nested-Loop Join,简单嵌套
        • Index Nested-Loop Join,索引嵌套
        • Block Nested-Loop Join ,join buffer缓冲区嵌套(临时表)

        驱动表和非驱动表的区别

        驱动表就是主表,非驱动表就是从表,看以下sql就知道了,A就是驱动表,B就是非驱动表。

        
        select * from A left join B

        A join B 连表时,一定先查A表再查B表吗?

        答案是不一定,因为mysql内部有一个优化器,它会根据你查询语句做一些优化,先查哪张表也是由优化器决定的,但可以肯定的是,先查询的那张表就是驱动表,反之就是非驱动表;关于是那张表先查的问题,我们通过看执行计划来得出结果;在前面加上explain关键字即可;

        
        explain select * from A join B;

        1、Simple Nested-Loop Join,简单嵌套-无索引的情况

        A left join B: ,每次都是全表匹配,A表的每行数据都全表匹配一次B表,也就是说,假如我A表有10条数据,B表有1000条数据,那么查询的时候扫描次数就是10*1000,也就说查询时需要扫描10000遍才能得出数据;

        2、Index Nested-Loop Join-有索引的情况

        select * from A join B on A.id=B.id where A.id = 1:在查询时,驱动表A会根据关联字段的索引进行查找,当在索引上找到符合的值,在回表进行查询,也就是说得匹配到索引后才会才会进行回表查询;
        如果非驱动表B的关联关联字段B.id是主键的话,性能会非常高,如果不是主键,会进行多次回表查询,先关联索引,然后根据二级索引的主键id进行回表查询,性能上比主键要慢;

        3、Block Nested-Loop Join ,join buffer缓冲区

        如果有索引,会选取Index Nested-Loop Join进行连表,如果join列没有索引,就会采用Block Nested-Loop Join ,join buffer,在驱动表和非驱动表中间有个buffer的缓冲区,在查询时先将驱动表的数据缓存到buffer缓冲区内,然后批量与非驱动表进行匹配,这是一种将多次比较合并为一次比较的优化方案,注意:这里缓存的不只是关联表的列,select 后面的列也会缓存起来;

        缓冲区大小

        默认情况下buffer缓冲区join_biffer_size的容量为256k,如果说你的数据空间大于256k,就无法使用缓冲区了,转为最简单的循环嵌套Simple Nested-Loop Join,但是我们可以手动调整缓冲区大小来装入大容量的数据;查看join_biffer_size的sql:show variables like '%join_biffer_size%'

        数据量大的表和数据量小的表如何选择连接顺序

        最好由小表去连接大表,这样会减少扫描次数;比如大表有1000条数据,小表只有10条数据,那么最好的连接方式为:小表 join 大表;为什么要这么做呢?

        • 如果是大表 join 小表,假如我们的数据在大表的第999行,那么查询数据的时候就至少得扫描999次才能查出来;
        • 如果是小表 join 大表,假如我们的数据在小表的第9行,

        细节

        • 连表查询的时候,最好不要超过三张表,因为需要join的字段,数据类型必须一致
        • 优先使用内连接来连表,外连接查询数据消耗的性能比内连接要高;
        • 确保关联查询中on 后面的列或者 using()中的字段带有索引,连表时可加快数据访问

        到此这篇关于浅谈mysql join底层原理的文章就介绍到这了,更多相关mysql join底层原理内容请搜索自学编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持自学编程网!

        您可能感兴趣的文档:

        --结束END--

        本文标题: 浅谈mysql join底层原理

        本文链接: https://www.lsjlt.com/news/10458.html(转载时请注明来源链接)

        有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

        本篇文章演示代码以及资料文档资料下载

        下载Word文档到电脑,方便收藏和打印~

        下载Word文档
        猜你喜欢
        • 浅谈mysql join底层原理
          目录join算法驱动表和非驱动表的区别1、Simple Nested-Loop Join,简单嵌套-无索引的情况2、Index Nested-Loop Join-有索引的情况3、Block Nested-Loop J...
          99+
          2022-05-30
          mysql join底层原理 mysql join
        • 浅谈mysql join底层原理是什么
          本篇内容主要讲解“浅谈mysql join底层原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“浅谈mysql join底层原理是什么”吧!目录join算法驱动表和非驱动表的区别Simpl...
          99+
          2023-06-20
        • 浅谈一下mysql数据库底层原理
          1.数据库事务的基本特性。 原子性: 事务中的所有操作要么全部提交成功,要么全部失败回滚。 场景:UPDATE cs_user SET age = 18 , gender = '女' WHER&#...
          99+
          2023-04-20
          mysql数据库 mysql底层原理
        • 浅谈React底层实现原理
          目录1. props,state与render函数关系,数据和页面如何实现互相联动?2. React中的虚拟DOM常规思路改良思路(仍使用DOM)React的思路深入理解虚拟DOM3...
          99+
          2022-11-13
        • 浅谈JavaIO之try with底层原理
          目录IO关闭的问题使用try with resourcetry with resource的原理自定义resourceIO关闭的问题 最近写了一个例子,读取一个文件没有问题,但是读取...
          99+
          2022-11-12
        • 浅谈Java 并发的底层实现
          并发编程的目的是让程序运行更快,但是使用并发并不定会使得程序运行更快,只有当程序的并发数量达到一定的量级的时候才能体现并发编程的优势。所以谈并发编程在高并发量的时候才有意义。虽然目前还没有开发过高并发量的程序,但是学习并发是为了更好理解一些...
          99+
          2023-05-30
          java 并发 底层
        • mysql事务和隔离级别底层原理浅析
          目录前言一、事务底层原理浅析原子性:持久性隔离性:一致性:二、隔离级别底层原理浅析三、总结前言 首先回顾一下什么是事务,事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一...
          99+
          2022-11-12
        • Spring底层原理由浅入深探究
          目录Spring简介Spring中是如何创建一个对象Bean的创建过程推断构造方法AOP大致流程Spring事务Spring简介 ClassPathXmlApplicationCon...
          99+
          2023-02-24
          Spring底层原理 Spring核心原理 Spring底层核心
        • 如何浅析mysql事务和隔离级别底层原理
          本篇文章给大家分享的是有关如何浅析mysql事务和隔离级别底层原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言首先回顾一下什么是事务,事务是数据库操作的最小工作单元,是作...
          99+
          2023-06-21
        • 浅谈JVM 底层解析 i++和 ++i 区别
          目录一、前言二、代码实现三、字节码指令四、字节码解析1. 第一类问题2. 第二类问题3. 第三类问题4. 第四类问题一、前言 如果只用普通的知识解释i++和++i的话 i++ 先将...
          99+
          2022-11-12
        • 深入浅出分析C++ string底层原理
          目录一、深浅拷贝 浅拷贝:深拷贝二、string迭代器原理 三、string的传统写法 1.构造实现 2.其他接口 一、深浅拷贝 浅拷贝: 在实现string时要是不实先strin...
          99+
          2022-11-12
        • 浅谈MySQL之浅入深出页原理
          目录一、页的概览二、Infimum 和 Supremum三、使用Page Directory四、页的真实面貌4.1、File Header4.2、Page Header4.3、Infimum & Suprem...
          99+
          2022-05-19
          MySQL 页原理
        • 怎样理解MySQL索引底层原理
          这篇文章给大家介绍怎样理解MySQL索引底层原理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Mysql 作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤...
          99+
          2022-10-18
        • 深入理解 MySQL 索引底层原理
          目录mysql 索引底层数据结构选型哈希表(Hash)二叉查找树(BST)AVL 树和红黑树B 树5.B+树Innodb 引擎和 Myisam 引擎的实现MyISAM 引擎的底层实现(非聚集索引方式)Innodb 引擎的...
          99+
          2022-12-25
          MySQL 索引底层原理 MySQL索引底层实现原理 MySQL数据库索引底层原理
        • 深入理解 MySQL 索引底层原理
          目录Mysql 索引底层数据结构选型哈希表(Hash)二叉查找树(BST)AVL 树和红黑树B 树5.B+树Innodb 引擎和 Myisam 引擎的实现MyISAM 引擎的底层实现...
          99+
          2022-12-25
          MySQL 索引底层原理 MySQL索引底层实现原理 MySQL数据库索引底层原理
        • MySQL索引的底层原理怎么理解
          这篇文章主要介绍了MySQL索引的底层原理怎么理解的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL索引的底层原理怎么理解文章都会有所收获,下面我们一起来看看吧。Mysql 作为互联网中非常热门的数据库,...
          99+
          2023-07-04
        • MySQL索引的底层原理是什么
          这篇文章将为大家详细讲解有关MySQL索引的底层原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。索引类型从索引的实现上,我们可以将其分为聚集索引与非...
          99+
          2022-10-18
        • mysql数据库底层原理是什么
          这篇“mysql数据库底层原理是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysq...
          99+
          2023-04-22
          mysql
        • HashMap底层原理分析
          小编给大家分享一下HashMap底层原理分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!众所周知,HashMap是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存...
          99+
          2023-06-27
        • hashmap底层实现原理
          一、hashmap底层实现原理 HashMap是基于哈希表的Map接口的非同步实现。元素以键值对的形式存放,并且允许null键和null值,因为key值唯一(不能重复),因此,null键只有一个。另外,hashmap不保证元素存储的顺...
          99+
          2023-10-29
          底层 原理 hashmap
        软考高级职称资格查询
        编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
        • 官方手机版

        • 微信公众号

        • 商务合作