2024-11-09
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1231375824

回答

MySQL 架构上分为 Server 层和存储引擎层。Server 层主要负责连接处理、授权认证、SQL 解析、分析优化、缓存等功能,而存储引擎层负责数据的存储和提取。对于一条查询 SQL 的执行过程如下:

1、客户端连接:客户端基于网络连接到 MySQL 服务器,发送查询请求到服务器。客户端通常会维护一个数据库的连接池以减少连接创建和销毁的开销,这是提升性能的通用设计。

2、查询缓存:当MySQL 服务端开启了缓存,一条查询 SQL 语句会先判断缓存中是否包含当前 SQL 语句的键值对。如果有则直接将对于结果返回。如果表更改,则该表的所有查询缓存都会失效并从缓冲池中删除。

3、SQL 分析:MySQL 会对 SQL 进行词法分析、语法分析、预处理并生成一颗解析树。在此过程中会校验SQL 语法、表和字段是否存在。另外此阶段构建的 SQL 语法树,对于获取 SQL 类型、表名、字段名、where 条件等至关重要。

4、SQL 优化:优化器负责将上述生成的语法树转换为执行计划。MySQL 使用基于成本的优化器选择成本最小的执行计划。当然优化器也有可能选择的是非最优执行计划。优化器执行时会决定使用哪个索引以及多表关联(join)时各表的连接顺序等。

5、SQL 执行:执行器依据优化器生成执行计划调用存储引擎层 API 接口。

6、存储引擎:存储引擎层负责存储数据,Server 层通过调用引擎层 API 获取数据返回给客户端。

扩展

查询 SQL 执行流程

SQL 语法树

在计算机科学中,抽象语法树树(AST)是源代码语法结构的一种抽象表示。从上文介绍中知道一条 SQL 在执行过程中同样会被 MySQL 引擎层解析为一颗 SQL 语法树。对于一条查询 SQL,如

select name,age,gender from t_user where age > 18 and gender = 'M'会解析为:

SQL 的执行顺序

一条 SQL 的执行并非如高级编程语言一样遵循书写顺序执行(线性或结构化流程控制),而是按照数据库系统内部定义固定顺序解析执行,对于 SQL

select name,max(age) as age from t_user where age > 18 group by name order by age limit 10

MySQL 的执行顺序如下:

了解 SQL 的逻辑执行顺序对于书写高性能 SQL 至关重要,如由于 WHERE 子句在 GROUP BY 子句之前执行,那么可以在 WHERE 子句中尽早过滤掉不需要的行,减少 GROUP BY 处理的数据量。

阅读全文