一, MySQL基础架构分析
1.1 MySQL基本架构组件概览
组件 | 大致功能 |
---|
连接器 | 身份验证和权限相关(登录时) | 查询缓存 | 执行查询语句时, 会先查询缓存(MySQL 8.0移除) | 分析器 | 没有命中缓存, 经过分析器(词法分析, 语义分析) | 优化器 | 生成SQL语句的最优执行计划 | 执行器 | 操作引擎,返回查询结果 |
简单来说, MySQL主要分为Server层和存储引擎层:
- Server层: 主要包括连接器, 查询缓存, 分析器, 优化器等. 所有跨存储引擎的功能都在这一层实现,
比如存储过程, 触发器, 视图, 函数等等, 还有一个通用的日志模块-binlog日志模块;
- 存储引擎: 主要负责引擎的存储和读取, 采用可以替换的插件式架构, 支持InnoDB, MyISAM, Memory等多个存储引擎.
其中 InnoDB 引擎有自有的日志模块 redolog 模块。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始就被当做默认存储引擎了。
1.2 Server层基本组件介绍
- 连接器(身份验证和查询权限)
验证用户名和密码是否正确(数据库mysql的user表中进行验证),如果错误返回错误通知(deAcess nied for user ‘root’@‘localhost’(using password:YES)),如果正确,则会去 mysql 的权限表(mysql中的 user、db、columns_priv、Host 表,分别存储的是全局级别、数据库级别、表级别、列级别、配合 db 的数据库级别)查询当前用户的权限。
- 注意: 本次数据库连接不断开的话, 即便是此时修改了权限也不会生效;
- 查询缓存(MySQL 8.0后移除)
查询缓存,存储的数据是以键值对的形式进行存储(key是查询语句, value是执行结果),
-
如果开启了缓存,那么在一条查询sql语句进来时会先判断缓存中是否包含当前的sql语句键值对,如果存在直接将其对应的结果返回,如果不存在再执行后面一系列操作。如果没有开启则直接跳过。 -
由于查询缓存前后两条查询SQL必须完全一致。 , 查询语句中含有一些不确定的值时,则不会缓存 , 如果表更改,则使用该表的所有高速缓存查询都变为无效并从缓存中删除 , 所以查询缓存非常容易失效;
- 分析器(分析SQL是来干嘛的, 词法分析和语法分析)
未命中缓存, 就由分析器对SQL进行分析, 分析SQl语句是来干嘛的 - 第一步: 词法分析 (提取关键字) - 第二步: 语法分析 (判断sql是否符合语法), 分析到语法错误,会直接抛给客户端异常:ERROR:You have an error in your SQL syntax.
- 优化器(设计最优的SQL执行方案)
优化器的作用是确定最优的执行方案 ;比如多个索引的时候如何选择索引, 多表关联查询的时如何选择连接顺序等等
- 执行器(调用存储引擎接口, 返回执行结果)
MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。
二, 结合🌰说一说查询,更新的过程
2.1 查询语句的执行过程
2.2 更新语句的执行流程
与查询流程不一样的是,更新流程还涉及两个重要的日志模块,redo log(重做日志) 和 binlog (归档日志) 。
更新语句的具体执行流程
三, 凝练总结
- 参考资料
- 极客时间: MySQL45讲, 雀氏🐮, 强推
- https://github.com/kinglaw1204
- https://www.modb.pro/db/80921
|