回答
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 处理的数据量。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。