MySQL-进阶篇-基础架构:一条sql查询语句是如何执行的

摘自:01 | 基础架构:一条SQL查询语句是如何执行的?-MySQL实战45讲-极客时间

视频讲解:7分钟精通MySql中SQL执行原理_哔哩哔哩_bilibili

可结合学习,本文仅记录SQL语句的执行流程,以上内容有一些额外知识未做记录。


SELECT * FROM Table1;

基础架构:一条sql查询语句的执行流程图

        MySQL可以分为 Server 层和存储引擎层两部分。
        Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
        存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB MyISAM 、Memory等多个存储引擎。现在最常用的存储引擎是 InnoDB ,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。

1. 连接器

连接器负责跟客户端建立连接、获取权限、维持和管理连接。要想执行SQL语句,首先要连接数据库,由客户端的连接驱动与数据库的连接池实现连接。

在完成TCP握手后,连接器需要验证你的身份(用户名和密码):

  • 验证失败,返回"Access denied for user"错误,客户端程序结束执行;
  • 验证成功,连接器会到权限表里面查出你拥有的权限。之后这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。

2. 查询缓存(MySQL8.0版本以完全删除)

可不看,MySQL8.0版本以完全删除该功能。为了序号与图示对应写一写。

过去执行过的SQL语句和它的结果以键值对的形式缓存在内存里。如果SQL语句能够在缓存中找到,直接返回它对应的value-结果;如果找不到,继续后续的操作。

缺点:

  • 缓存查找慢
  • 新建缓存消耗
  • 批量失效(只要有对表的更新,与该表相关的所有语句都会失效,很频繁)

3. 解析器(词法分析、语法分析-SQL语句要做什么?)

  • 词法分析:

        通过sql/sql_lex.cc代码将SQL语句切分成各种token词。

        通过定义了各种关键字和操作符的symbols[]数组进行关键词和非关键词的标记

SELECT * FROM Table1;
将SELECT FROM识别为关键词
将* Table1识别为非关键词
  • 语法分析:

        bison语法分析器,通过sql/sql_yacc.cc规则代码将语句解析为“语法树”,判断你输入的这个SQL语句是否满足MySQL语法

        如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误。

4. 预处理器

对请求进行拆分。

先提交SQL模板语句,再提交参数执行。

对于多次重复执行的语句来说,提交一次模板即可,然后多次提交参数实现多次执行,提高效率。

此处会进行语法验证,表和列是否存在、别名歧义等。

5. 优化器(确定成本最小的执行计划-SQL语句要怎么做?)

基于成本的优化器CBO:从众多执行路径中选择一个成本最小的执行路径作为执行计划

成本是指数据库的数据表、数据量、索引等信息算出SQL语句对应的IO成本和CPU成本。

6. 执行器

先验证有没有权限。

执行器根据表的引擎定义,去使用这个引擎提供的接口。 按照执行计划,逐步到存储引擎中调用这些Handler API并拿到返回结果。 索引查询、遍历查询、构建临时表等都在此处完成。

7. 存储引擎

Handler API

8. 返回处理结果

执行器通过TCP返回

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

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

相关文章

学习MQ异步

1.MQ异步调用的优势 事件驱动模式: 优势: 总结: 2.初识MQ 核心概念以及结构: 常见的消息模型: 基本消息队列模型: 生产者代码: Testpublic void testSendMessage() throws IOException, Timeo…

C语言之_Generic用法实例(九十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

政安晨:【Keras机器学习实践要点】(三十)—— 使用斯温变换器进行图像分类

目录 设置 配置超参数 准备数据 辅助函数 基于窗口的多头自注意力计算 模型训练与评估 准备 tf.data.Dataset 建立模型 在 CIFAR-100 上训练 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政…

[StartingPoint][Tier2]Included

LXD https://www.hackingarticles.in/lxd-privilege-escalation/ Task 1 What service is running on the target machine over UDP? (目标机器上通过UDP运行的服务是什么?) $ nmap -sU 10.129.232.86 -p 69 tftp Task 2 What class o…

DRF多表关联的序列化和反序列化

DRF多表关联的序列化和反序列化 目录 DRF多表关联的序列化和反序列化序列化定制字段source一对多的序列化 多表关联的序列化方式1:在表模型中定义方法方式2:定制返回格式SerializerMethodField方式3:子序列化 多表关联的反序列化反序列化保存…

Linux【实战篇】—— NFS服务搭建与配置

目录 一、介绍 1.1什么是NFS? 1.2客户端与服务端之间的NFS如何进行数据传输? 1.3RPC和NFS的启动顺序 1.4NFS服务 系统守护进程 二、安装NFS服务端 2.1安装NFS服务 2.2 创建共享目录 2.3创建共享目录首页文件 2.4关闭防火墙 2.5启动NFS服务 2.…

秋叶Stable diffusion的创世工具安装-带安装包链接

来自B站up秋葉aaaki,近期发布了Stable Diffusion整合包v4.7版本,一键在本地部署Stable Diffusion!! 适用于零基础想要使用AI绘画的小伙伴~本整合包支持SDXL,预装多种必须模型。无需安装git、python、cuda等任何内容&am…

day9 | 栈与队列 part-1 (Go) | 232 用栈实现队列、225 用队列实现栈

今日任务 栈与队列的理论基础 (介绍:代码随想录)232 用栈实现队列(题目: . - 力扣(LeetCode))225 用队列实现栈 (题目: . - 力扣(LeetCode) ) 栈与队列的理论基础 栈 : 先进后出 队列: 后进先出 老师给的讲解:代码随想录 …

记一次centos合并excel,word,png,pdf为一个整体pdf的入坑爬坑过程(一直显示宋体问题)。

一、背景 原先已经简单实现了excel,word,png,pdf合成一个整体pdf的过程。并将它弄到docker容器中。 1、原先入坑的技术栈 php:7.4 (业务有涉及)php第三方包 setasign\Fpdi\Fpdi : 2.3.6 (pdf合并)libreoffice : 5.3.6.1ImageMagick: 6.9.10-68 2、…

本地PC安装eNSP Pro完成简单的WLAN实验

前言 上个月底华为更新一版eNSP Pro,新增了AC、AP、STA等设备,也就是说可以在eNSP中进行WLAN相关的实验了。之前写过一篇文章《将eNSP Pro部署在华为云是什么体验》介绍了怎么在华为云上部署eNSP Pro,这次使用本地PC机在虚拟机中安装eNSP Pr…

RF测试笔记:三阶交调失真概述及测试

1. 交调失真会带来哪些影响? 无线通信系统中,交调失真不仅会影响发射链路的性能,还会影响接收链路的性能。 对于发射链路,非线性最严重的部件非功率放大器莫属,当信号为宽带调制信号时,无论是在信号带宽内…

13 Php学习:面向对象

PHP 面向对象 面向对象(Object-Oriented,简称 OO)是一种编程思想和方法,它将程序中的数据和操作数据的方法封装在一起,形成"对象",并通过对象之间的交互和消息传递来完成程序的功能。面向对象编…

基于Python的深度学习的中文情感分析系统(V2.0),附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

【STL详解 —— list的介绍及使用】

STL详解 —— list的介绍及使用 list的介绍list的介绍使用list的构造list iterator的使用list capacitylist element accesslist modifiers 示例list的迭代器失效 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭…

基于Docker构建CI/CD工具链(八)用nginx收集测试报告

当前,我们已经介绍了如何使用 Apifox 和 JMeter 进行测试,尽管控制台已经输出了测试结果,但在实际工作中,我们通常需要更详细的测试报告。 测试报告在测试过程中已经生成,只需将其托管起来以便查阅。如果你有现成的 C…

C++11 设计模式4. 抽象工厂(Abstract Factory)模式

问题的提出 从前面我们已经使用了工厂方法模式 解决了一些问题。 现在 策划又提出了新的需求:对于各个怪物,在不同的场景下,怪物的面板数值会发生变化, //怪物分类:亡灵类,元素类,机械类 …

MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64)

MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64) 一、算法介绍二、算法步骤三、算法实现1.代码 (完整,注释清晰,可直接用)2.结果一、算法介绍 首先说明: ------这里代码手动实现,不调用matlab提供的法向量计算接口,更有助于大家了解法向量和曲率的计算方法,…

docker部署Prometheus+AlertManager实现邮件告警

文章目录 一、环境准备1、硬件准备(虚拟机)2、关闭防火墙,selinux3、所有主机安装docker 二、配置Prometheus1、docker启动Prometheus 三、添加监控节点1、docker启动node-exporter 四、Prometheus配置node-exporter1、修改prometheus.yml配置…

【网站项目】摄影竞赛小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

刷题之动态规划-回文串

前言 大家好,我是jiantaoyab,开始刷动态规划的回文串类型相关的题目 动态规划5个步骤 状态表示 :dp数组中每一个下标对应值的含义是什么>dp[i]表示什么状态转移方程: dp[i] 等于什么1 和 2 是动态规划的核心步骤,…