首页 > 其他分享 >5.join原理及用法

5.join原理及用法

时间:2023-03-29 15:23:19浏览次数:65  
标签:join 用法 索引 嵌套循环 表中 原理 查询 连接

join 用法及原理

  • Sql查询的基本原理
    • 表查询的分类
      • 单表查询
        • 根据 WHERE条件过滤表中的记录,然后根据SELECT指定的列返回查询结果
      • 两表连接查询
        • 使用ON 条件对两表进行连接形成一张虚拟结果集,然后根据WHERE条件过滤结果集中的记录,再根据SELECT指定的列返回查询结果
      • 多表连接查询
        • 先对第一张和第二张表按照两表连接查询,然后再用连接后的虚拟结果集和第三张表做连接记录,依次类推,直到所有表都连接上为止,最终形成一张虚拟结果集,然后根据WHERE条件过滤虚拟结果集中的记录,再根据SELECT指定的列返回结果
    • 多表连接结果通过是三个属性来决定
      • 方向性:在外连接中写在前边的表是左表,写在后边的表为右表
      • 主附关系
      • 对应关系
    • 表对应关系分类
      • 一对一
        • A表中的一行最多只能匹配B表中的一行
        • img
      • 一对多
        • A表中的一行可以匹配B表中的多行,但B表中的一行只能匹配A表中的一行
        • img
      • 多对多
        • A表中的一行对应B表中的多行,反之亦然
        • img
  • 表连接算法
    • Simple Nested-Loop Join(简单的嵌套循环连接)
      • 嵌套循环连接算法就是一个双层For循环,通过循环外层表的行数据,逐个与内层表的所有行数据进行比较来获取结果,当执行 SELECT * from tb1 LEFT JOIN level tb2 on tb1.id=tb2.user_id
        img
      • 特点
        • 简单粗暴,通过双层循环比较数据来获得结果,但算法显然太过于粗鲁,假如每个表有1万条数据,那么对数据比较的次数=1万* 1万 =1亿次,查询效率非常慢
    • Index Nested-Loop Join(索引嵌套循环连接)
      • 索引嵌套循环连接算法主要是为了减少内层表数据的匹配次数,通过外层表匹配条件直接与内层表索引进行匹配,避免和内层表的每个记录去进行比较,匹配次数=外层表的行数 * 内层表索引的高度
        img
    • Block Nested-Loop Join(缓存块嵌套循环连接)
      • 缓存块嵌套循环连接其优化思路是减少内层表的扫表次数,通过简单的嵌套循环查询图,左边的每一条记录都会对右表进行一次扫表,扫表的过程其实就是从内存读取数据的过程,这个过程比较消耗性能的
        img
        所以缓存块嵌套循环连接算法在通过一次性缓存外层表的多条数据,来减少内层表的扫表次数,如果无法使用索引嵌套连接算法的时候,数据库默认是使用缓存块嵌套循环算法
        img
      • 注意:
        • 使用Block Nested-Loop Join算法需要开启优化器管理配置的optimizer_switc的设置,默认为开启
          通过指令: SHOW VARIABLES LIKE 'optimizer_switc%' 查看配置
          img
        • 设置Join buffer的大小
          通过join_buffer_size参数可设置join buffer的大小
          指令:SHOW VARIABLES LIKE 'join_buffer_size%'
          img
  • 影响性能的因素
    • 内循环的次数
      • 小表驱动大表能够减少内循环的次数
      • 设置合理的缓冲区大小能够提高连接效率
    • 快速匹配
      • 扫描被驱动表寻找合适的记录可以看做一个查询,建索引,在被驱动表建立索引能够提高连接速度,
      • 例如在左连接中,左表是驱动表,右表是被驱动表,要想快速查找表中匹配的记录,可以在右表中建立索引,右连接相反
    • 排序
      • 优先选择驱动表的属性进行排序能够提高效率
  • 链接:

标签:join,用法,索引,嵌套循环,表中,原理,查询,连接
From: https://www.cnblogs.com/blackamon/p/17269048.html

相关文章

  • 《网络对抗技术》——Exp3 免杀原理与实践
    一、实践内容1.1实践要求1、正确使用msf编码器,使用msfvenom生成如jar之类的其他文件2、veil,加壳工具3、使用C+shellcode编程4、通过组合应用各种技术实现恶意代码......
  • 分布式技术原理与算法解析 04 - 存储&高可靠
    分布式存储分布式数据复制技术常用于数据备份同步复制技术注重一致性,用户请求更新数据库时,主数据库要同步到备数据库后才结束阻塞返回给用户异步复制技术注重可用......
  • synchronized锁升级底层原理
    今天我们来聊聊Synchronized里面的各种锁:偏向锁、轻量级锁、重量级锁,以及三个锁之间是如何进行锁膨胀的。先来一张图来总结提前了解知识锁的升级过程锁的状态总共有四种:无......
  • 脏牛漏洞原理
    漏洞概述dirtycow漏洞是一种发生在写时复制的竞态条件产生的漏洞写时复制(copyonwrite)允许不同进程中的虚拟内存映射到相同物理内存页面的技术三个重要流程A:制作......
  • ThinkPHP框架:更新个别字段的值setField、setInc、setDec的用法
    ThinkPHP有三个更新个别字段的值的函数,分别为setField、setInc、setDec。setInc():将数字字段值增加setDec():将数字字段值减少setField,根据条件更新一个或多个字段的值......
  • DolphinDB StreamEngineParser 解析原理介绍
    DolphinDB曾发布过 DolphinDB:WorldQuant101Alpha因子的流批一体实现 和 DolphinDB:国泰君安191Alpha因子的流批一体实现 这两篇文章,介绍了如何基于DolphinDB的......
  • 河北稳控科技便携式钻孔测斜仪的组成与测量原理
    河北稳控科技便携式钻孔测斜仪的组成与测量原理 便携式钻孔测斜仪由测斜探头、多功能数据采集仪组成。测斜探头组成:探头包括吊环、传感段、导向段、加长段、尾段五部分......
  • 外连接—left join / right join
       ......
  • js中closest()的用法
    JavaScript中的closest()方法用于检索最接近的祖先,或者元素的父项与选择器匹配。如果没有找到祖先,则该方法返回 null 。此方法遍历文档树中的元素及其父元素,并继续遍历......
  • 20201331 黄文刚 Exp3-免杀原理
    20201331黄文刚Exp3-免杀原理基础问题回答(1)杀软是如何检测出恶意代码的?目前杀毒软件的原理主要有3种:引擎与病毒库的交互作用,通过特征码提取与病毒库中的特征码进行......