【MySQL·8.0·源码】MySQL 的查询处理

news2025/6/12 7:15:41

Query processing

MySQL 的 Query 处理可以分为 Parse、Prepare(Resolve/Transform)、Optimize 和 Execute 几个阶段

  • Parse
    词法扫描器将 SQL 语句字符串分解为 tokens,语法分析器将 tokens 组装成语法树的子树结构,并 Reduce 为基本查询结构,最终生成 SQL 语法解析数

    MySQL 语法解析树结构如【MySQL·8.0·源码】MySQL 语法树结构

    在这里插入图片描述

  • Prepare

    • Resolve
      语义检查
      对象解析(schema名称、表名称、view 对象,将其解析为实际存储对象,并检查是否存在)
      对子查询进行初步解析,尝试是否可以合并到外层
    • Transform
      逻辑改写转换(IN 转换为 semi-join,IN 转换为 EXISTS,ANY/ALL 改写)
      Outer JOIN 到 Inner JOIN 的转换
      条件谓词的 Transform
      子查询的 Transform
  • Optimize
    代价评估,table access method 选择,最优 join order 选择

    MySQL table access method 部分可以阅读 【MySQL·8.0·源码】MySQL 表的扫描方式

  • Execute
    查询执行处理

    • MySQL 采用的执行模型为 Volcano 迭代模型
    • MySQL 每个迭代器都有一个通用的迭代器接口,init()->read()
      unique_ptr<RowIterator> iterator(new ...);
      if (iterator->Init())
        return true;
      while (iterator->Read() == 0) {
        ...
      }
      
    • JOIN 连接也是一个迭代器
      • Nested Loop Join
      • BKA Join
      • Hash Join
        在这里插入图片描述

主要函数

先通过一个简单的单表索引查询所经过的重要函数,对各个阶段可能走过的重要函数有个大概印象,后序
会再通过不同的例子来说明各个函数的作用

Sql_cmd_dml::execute()
  Sql_cmd_dml::prepare                              // Prepare
    check_table_access                              ^
    open_tables_for_query                           |
      open_tables                                   |
        open_and_process_table                      |
          open_table                                |
    Query_block::prepare                            |        /* resolve 阶段  */
      Query_block::setup_tables                     |        ^
      setup_natural_join_row_types                  |        |
      Query_block::setup_wild                       |        |
      setup_fields                                  |        |
      Query_block::setup_conds                      |        |
        Query_block::setup_join_cond                |        v
      Query_block::apply_local_transforms           |        /* transform 阶段 */
        Query_block::simplify_joins                 |        ^
    lock_tables                                     |        |
                                                    v        v
    Query_expression::optimize                      // optimize 阶段
      Query_block::optimize                         ^
        JOIN::optimize()                            |
          JOIN::make_join_plan                      |
            Optimize_table_order::choose_table_order|
              Optimize_table_order::greedy_search   |
          make_join_query_block                     |
          JOIN::optimize_distinct_group_order       |
          JOIN::test_skip_sort                      |
          reduce_cond_for_table                     |
          make_join_readinfo                        |
            setup_semijoin_dups_elimination         |
          JOIN::make_tmp_tables_info                |
          JOIN::push_to_engines                     v
    Query_expression::execute                       // excute 阶段
      THD::send_result_metadata                     ^
      handler::ha_rnd_init                          |
        int ha_innobase::rnd_init                   |
      handler::ha_rnd_next                          |
        int ha_innobase::rnd_next                   |
          int ha_innobase::index_first              |
            int ha_innobase::index_read             ...
            ...

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

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

相关文章

Centos 磁盘挂载和磁盘扩容(新加硬盘方式)

步骤总结如下 一、对磁盘进行分区 二、对磁盘进行格式化 三、将磁盘挂载到对应目录 四、做开机自动挂载磁盘 磁盘分区 1.使用命令&#xff1a;fdisk -l 查看磁盘&#xff08;注&#xff1a;正常在Centos7中第一块数据盘标识一般是/dev/sda,第二块数据盘标识一般是/dev/sdb&…

小程序一次性订阅消息(消息通知):java服务端实现

文章目录 引言一、消息订阅1.1 小程序订阅消息功能介绍1.2 消息分类1.2.1 新版一次性订阅消息Beta1.2.2 一次性订阅消息&#xff08;用户通过弹窗订阅&#xff09;1.2.3 长期订阅消息&#xff08;用户通过弹窗订阅&#xff09;1.2.4 设备订阅消息 二、获取模板ID1.登录[微信公众…

10款值得推荐的Blazor UI组件库

前言 经常看到有小伙伴在DotNetGuide技术社区交流群里问有什么好用的Blazor UI组件库推荐的&#xff0c;本文将分享一些开源、实用、美观的Blazor UI组件库&#xff0c;提供给广大C#/.NET开发者们学习和使用&#xff08;注意&#xff1a;排名不分先后&#xff0c;都是十分优秀…

算法与数据结构之数组(Java)

目录 1、数组的定义 2、线性结构与非线性结构 3、数组的表现形式 3.1 一维数组 3.2 多维数组 4、重要特性&#xff1a;随机访问 5、ArrayList和数组 6、堆内存和栈内存 7、数组的增删查改 7.1 插入数据 7.2 删除一个数据 7.3 修改数组 7.4 查找数据 8、总结 什么…

CIFAR图片分类数据集

1. CIFAR介绍 官网链接&#xff1a;CIFAR-10 and CIFAR-100 datasets CIFAR-10是一个更接近普适物体的彩色图像数据集。CIFAR-10 是由Hinton 的学生Alex Krizhevsky 和Ilya Sutskever 整理的一个用于识别普适物体的小型数据集。一共包含10 个类别的RGB 彩色图片&#xff1a;飞机…

机器学习期末复习

机器学习 选择题名词解释&#xff1a;简答题计算题一、线性回归二、决策树三、贝叶斯 选择题 机器学习利用经验 &#xff0c;须对以下&#xff08;&#xff09;进行分析 A 天气 B 数据 C 生活 D 语言 归纳偏好值指机器学习算法在学习的过程中&#xff0c;对以下&#xff08;&a…

【Java基础篇】 try中return A,catch中return Bfinally中return C,最终返回值是什么?

try中return A&#xff0c;catch中return Bfinally中return C&#xff0c;最终返回值是什么? ✔️典型解析✔️拓展知识仓✔️finally 和 return 的关系 ✔️ final、finally、finalize有什么区别✔️final✔️finally✔️ finalize ✔️典型解析 最终的返回值将会是C 因为 fi…

计算机毕业设计-----SSM自习室图书馆座位预约管理系统

项目介绍 一款由jspssmmysql实现的图书馆预约占座管理系统&#xff0c;前端采用的是当下最流行的easyui框架&#xff0c;后台用的ssm&#xff08;spring、springMVC、mybaits&#xff09;框架.添加学生和教师时会自动在用户表中注册&#xff0c;定时任务会定时生成座位信息&am…

Cortex-M3 内核的中断优先级

第一步&#xff1a;分组&#xff08;一次&#xff09; 第二步&#xff1a;根据每个中断&#xff0c;设置抢占优先级&#xff08;根据分组可以知道可以几位设置&#xff09;&#xff0c;然后子优先级。 1. 中断编号 ARM 为 Cortex-M3 内核 一共设计了 255 个中断&#xff0c;编号…

【SpringBoot开发】之商城项目案例(订单及订单项生成)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之商城项目系列》。&#x1f3af…

Ubuntu无网络解决办法

1.进入root并输入密码 sudo su 2.更新NetworkManager的配置 用vim打开NetworkManager.conf vim /etc/NetworkManager/NetworkManager.conf 将第五行 managedFalse 改为 managedTrue 。 如果本身就是True就不用改了。 3.删除NetworkManager配置 service NetworkManager st…

Application layer

title: 应用层 date: 2023-12-20 21:03:48 tags: 知识总结 categories: 计算机网络 应用层&#xff1a;负责最直观的应用请求的封装、发起 一、域名系统DNS 连接在互联网上的主机不仅有IP地址&#xff0c;还有便于用户记忆的主机名字。域名系统DNS能够把互联网上的主机的名字…

看完这篇 教你玩转镜像转换神器qumu实现虚拟机做题自由!

前言&#xff1a; 最近有小伙伴说比赛没设备&#xff0c;问有没有不需要设备也能实现做题自由的方法&#xff0c;今天这里分享一期&#xff01; 看完这篇你将学会 使用qumu转换镜像格式 一般我们做题都是img格式的环境 需要导入设备&#xff0c;有些小伙伴没有设备 就可以使用…

擎创动态 | 某城商行案例入选信通院 GOLF+年度明星解决方案

2023年12月15日&#xff0c;“2023GOLF IT新治理领导力论坛”在京召开&#xff0c;该论坛由中国信息通信研究院、中国通信标准化协会主办。在此次论坛中&#xff0c;主办方正式发布了XOps领域年度评选结果。擎创科技“一体化智能根因定位解决方案”凭借优秀的落地实践成果&…

Navicat 技术干货 | 如何查看关系型数据库(MySQL、PostgreSQL、SQL Server、 Oracle)查询的运行时间

在数据库优化中&#xff0c;理解和监控查询运行时间是至关重要的。无论你是数据库管理员、开发人员或是参与性能调优的人员&#xff0c;知道如何查看查询运行时间能为你的数据库操作提供有价值的参考。本文中&#xff0c;我们将探索几款热门的关系数据库&#xff08;如 MySQL、…

门店总数超9000家,手握大众茶饮“下沉市场牌”的古茗冲刺上市

奶茶品牌上市潮来袭。1月2日&#xff0c;奶茶品牌古茗控股有限公司&#xff08;下称“古茗”&#xff09;、蜜雪冰城股份有限公司&#xff08;下称“蜜雪冰城”&#xff09;一同递交招股书&#xff0c;计划在港交所主板上市。 近年来&#xff0c;随着现制茶饮的爆火&#xff0…

vue-amap区域显示,3d棱柱效果

文章目录 一、在vue项目中安装和基本使用1. 安装2. 在vue项目中使用1. 在main.js中引入2. demo显示高德地图 二、显示区域三、只显示某个区域四、3D棱柱区域五、添加卫星图层 vue-amap中文文档&#xff1a; https://www.wenjiangs.com/doc/mdxkhhtr 一、在vue项目中安装和基本…

30道Nginx面试题含答案(很全)

1. 什么是Nginx&#xff1f; Nginx是一个 轻量级/高性能的反向代理Web服务器&#xff0c;他实现非常高效的反向代理、负载平衡&#xff0c;他可以处理2-3万并发连接数&#xff0c;官方监测能支持5万并发。 2. 为什么要用Nginx&#xff1f; 跨平台、配置简单、方向代理、高并…

nVisual如何实现数据中心资产管理

背景 随着信息技术的迅速发展&#xff0c;数据中心已经成为了企业信息化建设的重要基础设施之一。数据中心不仅承载着大量的企业数据和业务应用&#xff0c;而且也需要大量的资产投入来支持其运营和发展。 因此&#xff0c;数据中心资产管理的重要性也日益凸显&#xff0c;数…

单电阻落地扇电机驱动 DEMO 方案

SYNWIT DEMO方案 低压 PMSM 电机&#xff0c;软件上采用SVPWM空间电压矢量调制技术&#xff0c;直接闭环启动&#xff0c;相比传统方波效率提高15%&#xff0c;具有更小的谐波分量及转矩脉动&#xff0c;同时采用32位MCU芯片SWM201G6S7 SSOP28 封装为主控&#xff0c;为驱动算…