跳至主要內容

MySQL 执行流程

pptg大约 2 分钟

1. MySQL整体架构

MySQL整体架构
MySQL整体架构

MySQL的整体分为两部分:

  • Server层:负责与客户端建立连接分析SQL语句,并执行SQL
  • 存储引擎:负责数据的存储和提取

2. 执行流程

根据上面的架构,MySQL的执行流程如下:

  1. 连接

客户端和MySQL使用TCP进行连接,命令如下:

mysql -h$ip -u$user -p

MySQL支持长连接和短连接,在长连接的情况下,MySQL会记录每个连接的活跃度,如果空闲时长过长(默认8h)则会自动断开

长连接相比短连接可以减少建立和断开连接的过程,效率更高。但由于MySQL在执行查询过程中会使用内存管理连接对象,所以大量的长连接累计会导致MySQL内存过大进而崩溃重启。为此,可以采用以下方法解决:

  • 定期断开长连接
  • 客户端主动重制连接:调5.7后支持用mysql_reset_connection()函数来重制连接,释放内存。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。
  1. 查询缓存

注意

这个步骤只在8.0之前生效,因为只要一个表有更新就会清空这个表的缓存,所以命中率太低,所以8.0之后将其移除了

MySQL在这个过程中会以key(语句)-value(值)缓存记录,如果查询语句命中的话就会直接返回,否则会继续执行并将结果记录在缓存中。

  1. 解析SQL

在执行SQL前,解析器会对SQL进行解析:

  • 词法分析:首先根据SQL识别出关键词,比如select username from userinfo会识别出关键词selectfrom以及非关键词usernameuserinfo
  • 语法分析:根据词法分析的结果,语法解析器会根据语法规则判断SQL是否满足语法。若满足则会构建SQL语法树,便于后续获取相关关键词和字段信息;若不满足则会报错:You have an error in your SQL syntax
  1. 执行SQL

对QL的执行,分为三个阶段:

  • 预处理阶段(prepare):预处理器
    • 检查SQL中的表和字段是否存在
    • select *扩展为所有的列
  • 优化阶段(optimize):优化器,确定SQL的执行方案(如索引选择、索引覆盖、全表查询等),可以通过explain + SQL来查看执行方案
  • 执行阶段(execute):执行器,根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端