Mysql——一条SQL语句的执行流程

一、Mysql的体系结构

架构图:

Mysql的体系结构主要分为以下几层:

1. Connectors 连接层:负责处理客户端的请求连接。

  • 系统在访问Mysql的服务器之前会先与服务器建立TCP连接,连接成功后Mysql会对TCP传输过来的用户信息做权限验证。

2. MySQL Server服务层

  • Connection Pool 链接池:负责处理和存储客户端与mysql服务器之间的链接。其中一个线程处理一个链接。
  • SQL Interface(SQL 接口):接受客户端的SQL,如DML、DDL、存储过程、视图、触发器等。
  • Parser(解析器):SQL传到解析器后会被解析、验证、优化。将SQL语句分解为数据结构并创建语法树,根据数据字典查询语法树,验证客户端的操作权限,创建好语法树后还会对语法进行优化。
  • Optimizer (查询优化器):在SQL语法解析后确定SQL的执行路径,生成执行计划(是否使用索引以及使用哪些索引,表之间的连接顺序)
  • Service & utilities (服务治理&工具集):包括Backup & Restore(数据备份和还原)、Security(安全)、Replication(复制)、Cluster(聚簇)、Partitioning(分区)、Workbench(工作台)等等集群管理服务和工具。
  • Caches 缓存等模块:用来缓存一条SELECT语句的执行结果,如果能够在其中找到对应的查询结果,那么就不必再进行查询解析、优化和执行的整个过程了,直接将结果反馈给客户端。(Mysql8.0后已删除)

3. 引擎层:Mysql支持插件式存储引擎

几种常见的存储引擎:

  • InnoDB: Mysql默认的存储引擎,支持事务、支持行锁、支持外键
  • MyISAM: 不支持事务、不支持外键,支持表锁
  • Memery: 支持哈希索引,数据存储在内存中

4. 存储层

文件的物理存储层,包括日志文件、数据等。

二、sql语句的执行流程

1、第一步:建立连接,在执行sql语句前,客户端首先需要mysql服务端建立连接,mysql是基于TCP协议进行传输的,所以需要先经历TCP的三次握手来建立连接。连接建立成功后,连接器会对用户名、密码进行校验。校验通过获取到用户权限后保存权限信息便于后续操作的权限判断。
2、第二步:查询缓存(mysql8.0之后已废弃),mysql服务端接收到sql后会先对SQL语句的第一个字段进行解析,如果是select会先进入到缓存模块查找缓存数据,缓存中数据是以key-value形式存储的,其中key就是sql语句,value就是返回值,如果缓存命中就直接返回缓存值。否则执行操作后把结果再写入缓存中。
3、第三步:解析sql,mysql中的解析器会对sql进行解析,包括词法解析,解析出语句中的关键字,语法解析,根据语句规则判断是否符合语法然后构建一个语法树。
4、第四步:执行sql,首先进入预处理阶段对表和字段进行判断,预处理后查询优化器会对sql语句制定一个执行计划,比如确定索引。优化器处理后就是执行器,根据索引选择执行方式,如(主键索引查询、全表查询、索引下推等)到存储引擎中获取到数据后返回给客户端。

相关推荐
逸Y 仙X5 分钟前
文章二十八:ElasticSearch 运用指标聚合快速统计数值
java·大数据·elasticsearch·搜索引擎·全文检索
霸道流氓气质6 分钟前
SpringBoot+LangChain4j+Ollama+MCP实现智能天气工具调用示例
java·spring boot·后端
sindyra6 分钟前
享元模式(Flyweight Pattern)
java·开发语言·设计模式·享元模式·优缺点
这是程序猿6 分钟前
设计模式入门:Java 单例模式(Singleton)详解,从入门到实战
java·单例模式·设计模式
codingPower7 分钟前
ApplicationListener 和 SpringApplicationRunListener 深度解析对比
java·开发语言·spring boot
HalvmånEver9 分钟前
MySQL视图
linux·数据库·学习·mysql·视图
2301_8084143810 分钟前
MySQL表的增删查改
数据库·mysql
ch.ju12 分钟前
Java Programming Chapter 2-Recursion of function
java·开发语言
铁皮哥14 分钟前
【后端开发】RabbitMQ、RocketMQ、Kafka 怎么选?我从业务场景重新梳理了一遍
java·linux·数据库·分布式·kafka·rabbitmq·rocketmq