MySQL 执行流程
大约 2 分钟
1. MySQL整体架构
MySQL的整体分为两部分:
- Server层:负责与客户端建立连接,分析SQL语句,并执行SQL
- 存储引擎:负责数据的存储和提取
2. 执行流程
根据上面的架构,MySQL的执行流程如下:
- 连接
客户端和MySQL使用TCP进行连接,命令如下:
mysql -h$ip -u$user -p
MySQL支持长连接和短连接,在长连接的情况下,MySQL会记录每个连接的活跃度,如果空闲时长过长(默认8h)则会自动断开
长连接相比短连接可以减少建立和断开连接的过程,效率更高。但由于MySQL在执行查询过程中会使用内存管理连接对象,所以大量的长连接累计会导致MySQL内存过大进而崩溃重启。为此,可以采用以下方法解决:
- 定期断开长连接
- 客户端主动重制连接:调5.7后支持用
mysql_reset_connection()
函数来重制连接,释放内存。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。
- 查询缓存
注意
这个步骤只在8.0之前生效,因为只要一个表有更新就会清空这个表的缓存,所以命中率太低,所以8.0之后将其移除了
MySQL在这个过程中会以key(语句)-value(值)
缓存记录,如果查询语句命中的话就会直接返回,否则会继续执行并将结果记录在缓存中。
- 解析SQL
在执行SQL前,解析器会对SQL进行解析:
- 词法分析:首先根据SQL识别出关键词,比如
select username from userinfo
会识别出关键词select
和from
以及非关键词username
和userinfo
- 语法分析:根据词法分析的结果,语法解析器会根据语法规则判断SQL是否满足语法。若满足则会构建SQL语法树,便于后续获取相关关键词和字段信息;若不满足则会报错:
You have an error in your SQL syntax
- 执行SQL
对QL的执行,分为三个阶段:
- 预处理阶段(prepare):预处理器
- 检查SQL中的表和字段是否存在
- 将
select *
扩展为所有的列
- 优化阶段(optimize):优化器,确定SQL的执行方案(如索引选择、索引覆盖、全表查询等),可以通过
explain + SQL
来查看执行方案 - 执行阶段(execute):执行器,根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端