广告
返回顶部
首页 > 资讯 > 数据库 >一文搞懂MySQL执行流程
  • 171
分享到

一文搞懂MySQL执行流程

mysql面试后端数据库 2023-10-27 13:10:13 171人浏览 安东尼
摘要

目录 一、MySQL技术架构 二、执行流程 1.连接器 2.查询缓存 3.解析SQL 4.执行SQL 总结 一、MySQL技术架构   可以看到,Mysql的技术架构共分为两层:Server层和存储引擎层 Server 层负责建立连接、分

目录

一、MySQL技术架构

二、执行流程

1.连接器

2.查询缓存

3.解析SQL

4.执行SQL

总结


一、MySQL技术架构

 

可以看到,Mysql的技术架构共分为两层:Server层和存储引擎层

Server 层负责建立连接、分析和执行 SQL

存储引擎层负责数据的存储和提取

二、执行流程

1.连接器

linux 操作系统里要使用 mysql,第一步肯定是要先连接 Mysql 服务。

  • 与客户端进行tcp三次握手建立连接;
  • 检验客户端的账号和密码,如果用户名或密码不对,则会报错;
  • 如果用户名和密码都正确,则会读取该用户的权限,将该权限存放在连接器中,后续的权限逻辑判断都基于此时读取到的权限。

2.查询缓存

建立连接后,就可以对收到的SQL语句进行解析,判断语句属于什么类型。

2.1 如果是select语句,MySQL就会先去查询缓存里查找缓存数据,如果缓存数据存在,那么就会直接返回查询结果给客户端,否则就要往下执行,等执行完后,将查询的结果存入查询缓存中。查询缓存是以 key-value 形式保存在内存中的,key 为 SQL 查询语句,value 为 SQL 语句查询的结果。

2.2对于非查询语句,MySQL 5.7版本不会再走查询缓存的机制,每次执行都会直接操作数据库,而不会尝试从缓存中获取结果。

3.解析SQL

3.1词法分析。MySQL 会根据你输入的字符串识别出关键字出来,构建出 SQL 语法树,这样方便后面模块获取 SQL 类型、表名、字段名、 where 条件等等。

3.2语法分析。根据词法分析的结果,语法解析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。

4.执行SQL

每条SELECT 查询语句的执行流程主要可以分为下面这三个阶段:

  • prepare 阶段,也就是预处理阶段;
  • optimize 阶段,也就是优化阶段;
  • execute 阶段,也就是执行阶段;

预处理器:①检查SQL查询语句中的表或者字段是否存在;②将select * 中的 * 扩展为表中的各个列;

优化器(主要负责将 SQL 查询语句的执行方案确定下来,不同执行计划的执行效率不同):使用explain命令查看SQL语句的执行计划,执行计划中的key就表示执行过程中使用了哪个索引

执行器(真正开始执行SQL语句):以主键索引查询为例

select * from product where id = 1;

这条查询语句的查询条件用到了主键索引,而且是等值查询,同时主键 id 是唯一,不会有 id 相同的记录,所以优化器决定选用访问类型为 const 进行查询,也就是使用主键索引查询一条记录,那么执行器与存储引擎的执行流程是这样的:

  • 执行器第一次查询,会调用 read_first_record 函数指针指向的函数,因为优化器选择的访问类型为 const,这个函数指针被指向为 InnoDB 引擎索引查询的接口,把条件 id = 1 交给存储引擎,让存储引擎定位符合条件的第一条记录。

  • 存储引擎通过主键索引的 B+ 树结构定位到 id = 1的第一条记录,如果记录是不存在的,就会向执行器上报记录找不到的错误,然后查询结束。如果记录是存在的,就会将记录返回给执行器;
  • 执行器从存储引擎读到记录后,接着判断记录是否符合查询条件,如果符合则发送给客户端,如果不符合则跳过该记录。
  • 执行器查询的过程是一个 while 循环,所以还会再查一次,但是这次因为不是第一次查询了,所以会调用 read_record 函数指针指向的函数,因为优化器选择的访问类型为 const,这个函数指针被指向为一个永远返回 - 1 的函数,所以当调用该函数的时候,执行器就退出循环,也就是结束查询了。

总结

执行一条 SQL 查询语句,期间发生了什么?

  • 连接器:建立连接,管理连接、校验用户身份;
  • 查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;
  • 解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;
  • 执行 SQL:执行 SQL 共有三个阶段:
    • 预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。
    • 优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划;
    • 执行阶段:根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;

来源地址:https://blog.csdn.net/weixin_57607868/article/details/131237945

您可能感兴趣的文档:

--结束END--

本文标题: 一文搞懂MySQL执行流程

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

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

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

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

下载Word文档
猜你喜欢
  • 一文搞懂MySQL执行流程
    目录 一、MySQL技术架构 二、执行流程 1.连接器 2.查询缓存 3.解析SQL 4.执行SQL 总结 一、MySQL技术架构   可以看到,MySQL的技术架构共分为两层:Server层和存储引擎层 Server 层负责建立连接、分...
    99+
    2023-10-27
    mysql 面试 后端 数据库
  • 一文搞懂MySQL运行机制原理
    目录前言mysql服务器体系架构网络连接层服务层存储引擎层系统文件层服务器处理客户端请求连接管理解析与优化查询缓存语法解析查询优化存储引擎小结前言 前文我们了解了MySQL采用客户端/服务器架构,用户通过客户端程序发送增...
    99+
    2022-09-30
  • 一文搞懂MySQL预编译
    1、预编译的好处   大家平时都使用过JDBC中的PreparedStatement接口,它有预编译功能。什么是预编译功能呢?它有什么好处呢?   当客户发送一条SQL语句给服务器后,服务器总是需要校验SQL语句的语...
    99+
    2022-05-23
    MySQL 预编译 MySQL 编译
  • 一文搞懂MySQL事务特性
    本文主要给大家简单讲讲MySQL事务特性,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望MySQL事务特性这篇文章可以给大家带来一些实际帮助。事务特性ACID...
    99+
    2022-10-18
  • 一篇文章搞懂Python程序流程控制结构
    目录一、程序的组织结构1.三种基本结构2.程序流程图二、顺序结构二、选择结构(分支结构)1.单分支 if2.双分支 if…else3.多分支 if…eli...
    99+
    2022-11-11
  • 一文带你看懂MySQL执行计划
    目录前言explain/desc 用法explain/desc 输出详解一、id ,select 查询序列号二、select_type,查询语句类型三、table,查询涉及...
    99+
    2022-11-13
  • 一文搞懂java中类及static关键字执行顺序
    目录类的生命周期static关键字static关键字执行顺序继承中的static执行顺序总结类的生命周期 加载:classpath、jar包、网络、某个磁盘位置下的类的class二...
    99+
    2022-11-13
  • 一文搞懂MySQL元数据锁(MDL)
    目录一、什么是metadata lock二、MDL和行锁有什么区别三、MDL为什么会造成系统崩溃四、MDL的生命周期有多长五、如何快速找到阻塞源头六、本文开始的案例最终如何解决小结某日,路上收到用户咨询,为了清除空间,想...
    99+
    2022-09-16
  • 一文搞懂MySQL索引页结构
    目录1.前言2.索引页结构2.1FileHeader2.2PageHeader2.3UserRecords2.4Infimum&Supremum2.5PageDirector...
    99+
    2022-11-13
  • 一篇文章搞懂Python Unittest测试方法的执行顺序
    目录Unittest回到主题源码初窥回到问题的本质1. 以字典序的方式编写test方法2. 回归本质,从根本解决问题总结Unittest unittest大家应该都不陌生。它作为一款...
    99+
    2022-11-12
  • 一文搞懂MySQL中EXPLAIN解释命令
    本文主要给大家简单讲讲MySQL中EXPLAIN解释命令,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望MySQL中EXPLAIN解释命令这篇文章可以给大家带...
    99+
    2022-10-18
  • 一篇文章搞懂MySQL加锁机制
    目录前言锁的分类乐观锁和悲观锁共享锁(S锁)和排他锁(X锁)按加锁粒度区分全局锁表级锁(表锁和MDL锁)意向锁行锁间隙锁next-key lock(临键锁)加锁规则死锁和死锁检测总结...
    99+
    2022-11-13
  • 一文搞懂 parseInt()函数异常行为
    目录正文1. parseInt() 的怪异行为2.解决parseInt()怪异行为3.总结正文 parseInt()是内置的 JS 函数,用于解析数字字符串中的整数。 例如,解析数字...
    99+
    2023-05-20
    parseInt()函数 parseInt()函数异常
  • 一篇文章弄懂MySQL查询语句的执行过程
    前言 需要从数据库检索某些符合要求的数据,我们很容易写出 Select A B C FROM T WHERE ID = XX  这样的SQL,那么当我们向...
    99+
    2022-11-12
  • 一文搞懂什么是MySQL前缀索引
    目录一、什么是前缀索引二、为什么要用前缀索引三、怎么创建前缀索引四、使用前缀索引需要注意的事项五、小结一、什么是前缀索引 所谓前缀索引,说白了就是对文本的前几个字符建立索引(具体是几个字符在建立索引时去指定),比如以产品...
    99+
    2022-09-29
  • 一文搞懂Scrapy与MongoDB交互过程
    Pipeline.py class MongoDBPipeline: def __init__(self,conn,database): self.conn = conn self...
    99+
    2022-07-08
    Scrapy与MongoDB Scrapy与MongoDB交互
  • 一文彻底搞懂Kotlin中的协程
    产生背景 为了解决异步线程产生的回调地狱 //传统回调方式 api.login(phone,psd).enquene(new Callback<User>(){ ...
    99+
    2022-11-11
  • Mysql 执行流程
    1、逻辑剖析 sql 执行流程为:sql语句 -> 查询缓存 -> 解析器 -> 优化器 -> 执行器。 1.1 服务器处理客户端请求 ​ 客户端程序 connectors >> 连接池 >> SQL接口 >> 解析器 >> 优化器 ...
    99+
    2020-07-21
    Mysql 执行流程
  • 一文搞懂mysql的分区和分表知识
    下面一起来了解下mysql的分区和分表,相信大家看完肯定会受益匪浅,文字在精不在多,希望mysql的分区和分表这篇短内容是你想要的。mysql分表和分区1.mysql分表什么是分表?分表是将一个大表按照一定...
    99+
    2022-10-18
  • 一文搞懂MySQL索引特性(清晰明了)
    目录为什么要有索引?认识磁盘磁盘的结构磁盘的盘片结构定位扇区mysql与磁盘交互索引的理解测试主键索引索引的原理索引结构是否可以使用其他数据结构聚簇索引 vs 非聚簇索引总结为什么要有索引? MySQL索引的建立对于My...
    99+
    2023-04-10
    mysql索引特性 mysql索引特点 mysql索引使用
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作