当前位置: 首页 > web >正文

MySQL:Join连接的原理

在这里插入图片描述

连接查询的执行过程:

  1. 确定第一个需要查询的表【驱动表】
    1. 选取代价最小的访问方法去执行单表查询语句
  2. 从驱动表每获取到一条记录,都需要到t2表中查找匹配的记录
    在这里插入图片描述

两表连接查询需要查询一次t1表,两次t2表,在两表的连接查询中,驱动表只需访问一次,被驱动表可能需要访问多次
并不是所有满足条件的驱动表记录先查询出来放到一个地方再去被驱动表查询的【如果符合条件的记录很多,需要很大的存储空间】,每获取到一条驱动表记录,就立刻到被驱动表中寻找匹配的记录

内连接和外连接

  • 对于内连接的两个表,若驱动表中的记录在被驱动表中找不到匹配的记录,则该记录不会加入到最后的结果集

    • 对于内连接来说,驱动表和被驱动表是可以互换的
  • 对于外连接的两个表,即使驱动表中的记录在被驱动表中没有匹配的记录,也仍需要加入到结果集中

    • 左外连接:左侧表为驱动表

      • 在这里插入图片描述
    • 右外连接:右侧表为驱动表

      • 在这里插入图片描述
    • 驱动表记录筛选

      • where子句过滤
      • On子句过滤:专门为外连接驱动表中的记录在被驱动表找不到匹配记录时是否应该把驱动表记录加入结果集中这一场景设计
  • 嵌套循环连接

    • 在这里插入图片描述

    • 在这里插入图片描述

    • 驱动表只访问一次,但被驱动表可能访问多次,且访问次数取决于对驱动表执行单表查询后的结果集中有多少条记录

    • 驱动表得到一条记录->被驱动表查询匹配到结果->把组合后的记录发送给客户端,再到驱动表中获取下一条记录

  • 使用索引加快连接速度

    • 建议最好不要使用*作为查询列表,而是把真正用到的列作为查询列表
  • 基于块的嵌套循环连接Block Nested-Loop Join

    • Join Buffer连接缓冲区【减少被驱动表的访问次数】
      • 执行连接查询前申请的一块固定大小的内存,先把若干条驱动表结果集中的记录装在Join Buffer中,然后开始扫描被驱动表,每一条被驱动表的记录一次性地与Join Buffer中的多条驱动表记录进行匹配,匹配过程都在内存中完成,显著减少被驱动表的I/O代价

      • 在这里插入图片描述

      • 最好的情况是Join Buffer足够大,能容纳驱动表结果集中的所有记录,只需访问一次被驱动表就可完成连接操作

      • Join Buffer大小可以通过启动选项或系统变量join_buffer_size进行配置【默认256KB,最小128字节】

      • 优化对被驱动表的查询时,最好为被驱动表加上高效率索引,实在不行可尝试调大join_buffer_size对连接查询进行优化

      • 需注意,不会存放被驱动表记录的所有列,只有查询列表中的列和过滤条件中的列【最好不要用*查询】,Join Buffer可以放更多记录

Join注意点

  • 小表作为驱动表,被驱动表是否能命中索引
    • 驱动表需要全表扫描,而被驱动表通过索引查询
http://www.xdnf.cn/news/141.html

相关文章:

  • 54常用控件_QLCDNumber的属性
  • 支持mingw g++14.2 的c++23 功能print的vscode tasks.json生成调试
  • 细节:如何制作高质量的VR全景图
  • 《软件设计师》复习笔记(11.6)——系统转换、系统维护、系统评价
  • 【dataframe显示不全问题】打开一个行列超多的excel转成df之后行列显示不全
  • 25MathorCup选题浅析(睡醒扫一眼题目版)
  • Spark on K8s 在 vivo 大数据平台的混部实战与优化
  • 从零开始学A2A一:A2A 协议的高级应用与优化
  • 优化WAV音频文件
  • Flink 2.0 编译
  • 微信小程序怎么分包步骤(包括怎么主包跳转到分包)
  • Java集合框架深度解析:HashMap、HashSet、TreeMap、TreeSet与哈希表原理详解
  • C++ `unique_ptr` 多线程使用
  • 【React】通过 fetch 发起请求,设置 proxy 处理跨域
  • ESP32 搭建IDF+Vscode环境(详细教程)
  • 轻量化高精度的视频语义分割
  • 网络安全-Burp Suite基础篇
  • Android 音频架构全解析:从 AudioTrack 到 AudioFlinger
  • 【TeamFlow】 1 TeamFlow 去中心化生产协同系统架构
  • python抓取HTML页面数据+可视化数据分析(投资者数量趋势)
  • NFC 碰一碰发视频源码搭建,碰一碰发视频定制化开发技术
  • JavaScript性能优化实战指南
  • 云轴科技ZStack入选中国人工智能产业发展联盟《大模型应用交付供应商名录》
  • UE5 渲染视频
  • 龙虎榜——20250418
  • 微信小程序中,将搜索组件获取的值传递给父页面(如 index 页面)可以通过 自定义事件 或 页面引用 实现
  • C++面向对象
  • Windows .NET Core 应用程序部署到 IIS 解决首次访问加载慢的问题
  • Uniapp调用native.js使用经典蓝牙串口通讯方法及问题解决
  • 线上蓝桥杯比赛环境配置