组件 | 大致功能 |
---|---|
连接器 | 身份验证和权限相关(登录时) |
查询缓存 | 执行查询语句时, 会先查询缓存(MySQL 8.0移除) |
分析器 | 没有命中缓存, 经过分析器(词法分析, 语义分析) |
优化器 | 生成SQL语句的最优执行计划 |
执行器 | 操作引擎,返回查询结果 |
简单来说, MySQL主要分为Server层和存储引擎层:
- Server层: 主要包括连接器, 查询缓存, 分析器, 优化器等. 所有跨存储引擎的功能都在这一层实现,
比如存储过程, 触发器, 视图, 函数等等, 还有一个通用的日志模块-binlog日志模块;
- 存储引擎: 主要负责引擎的存储和读取, 采用可以替换的插件式架构, 支持InnoDB, MyISAM, Memory等多个存储引擎.
其中 InnoDB 引擎有自有的日志模块 redolog 模块。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始就被当做默认存储引擎了。
- 连接器(身份验证和查询权限)
验证用户名和密码是否正确(数据库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 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。
开始执行的时候,要先判断一下你对这个表 有没有执行对应操作的权限,如果没有,就会返回没有权限的错误;如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。
如果表没有索引,会从第一行一行一行地读取,根据where后面的条件是否满足,如果有索引则会根据索引的规则去寻找,然后执行生成结果集。
与查询流程不一样的是,更新流程还涉及两个重要的日志模块,
redo log(重做日志)
和binlog (归档日志)
。
更新语句的具体执行流程