MySQL 一条语句的执行

本文将介绍 MySQL 中语句的执行过程。

一、一条查询语句的执行

1. 连接并接收请求

略。

2. 缓存查询

服务器会首先查询缓存,如果有缓存,则直接返回;如果没有缓存,则继续执行查询,并将查询结果缓存。

需要注意的是:

  • 查询缓存可以在不同客户端之间共享

    客户端 A 查询请求处理完成后,如果客户端 B 发送了相同的查询请求,服务器会直接使用缓存的结果,而不会因为两个客户端不同而重新处理

  • 如果查询请求中包含某些 “容易改变” 的系统函数、自定义变量、自定义函数、系统表,则查询结果不会被缓存

  • 如果查询请求涉及的表发生了结构或数据的改变,则缓存会失效

  • 查询请求虽然能够提升一定的性能,但也会因为维护缓存而产生额外的开销。在 MySQL 8.0 中,查询缓存被删除

3. 语法解析

MySQL 服务器会对请求语句做文本分析、语法分析、信息提取。

4. 语句优化

MySQL 的优化程序会对语句进行优化,生成一个执行计划,包含语句的具体执行方法

例如:

  • 确定表的查询顺序
  • 确定是否使用索引以及使用什么索引
  • 外连接转换为内连接
  • 表达式简化
  • 子查询转换为连接

5. 执行并返回结果

执行器将根据执行计划,调用存储引擎的接口,获取结果。

参考

  • MySQL 技术内幕
  • MySQL 实战 45 讲
  • MySQL 是怎样运行的:从根儿上理解 MySQL