MySQL数据库的架构
MySQL 包含 Server 层和存储引擎层两大部分。
存储引擎层
负责数据的存储和提取,MySQL 采用插件式的存储引擎,常见的存储引擎有
- InnoDB
- MyISAM
- CSV
其中 InnoDB 是最常用的存储引擎,也是 MySQL 的默认存储引擎
Server 层
- 连接池: 用来身份认证和权限验证
- 查询缓存: 执行查询语句的时候,会先查询缓存,命中缓存之间返回
- 分析器: 没有命中缓存的话,SQL 语句就会经过分析器,检查你的 SQL 语句语法是否正确,分析你的 SQL 语句要干什么
- 优化器: 优化成最优的执行方案去执行
- 执行器: 执行优化后的语句,然后从存储引擎返回数据
连接器
- 连接器主要和身份认证和权限相关的功能相关,类似哨兵
- 主要负责用户登录数据库,进行用户的身份认证,包括校验账户密码,权限等操作
查询缓存
MySQL 查询不建议使用缓存,因为查询缓存经常失效,所以大多数情况下都是不去使用查询缓存的。
- 查询缓存主要用来缓存我们所执行的 SELECT 语句以及该语句的结果
- 连接建立后,执行查询语句的时候,会先查询缓存,如果缓存 key 被命中,就会直接返回给客户端,如果没有命中,就会执行后续的操作
- 查询完成后也会把结果缓存起来,方便下一次调用
- 真正执行缓存查询的时候还是会校验用户的权限,判断该用户是否有查询权限
分析器
如果 没有命中缓存,那么就会进入分析器,分析器主要是用来分析 SQL 语句是来干什么的,分为两步
词法分析,一条 SQL 语句有多个字符串组成,首先要提取关键字,比如 select,提出查询的表,提出字段名,提出查询条件等等
语法分析,主要就是判断你输入的 sql 是否正确,是否符合 MySQL 的语法
优化器
- 优化器的作用就是它认为的最优的执行方案去执行
- 例如如多个索引的时候该如何选择索引
- 经过了优化器之后就可以让执行器去执行sql了
执行器
- 首先执行前会校验该用户有没有权限,如果没有权限,就会返回错误信息
- 如果有权限,就会去调用引擎的接口,返回接口执行的结果。
一条查询语句如何执行
select name from student where age= '18' and sex = '女'
我们分析下这个语句的执行流程:
先检查该语句是否有权限,如果没有权限,直接返回错误信息
如果有权限,在 MySQL8.0 版本以前,会先查询缓存,如果命中缓存之,间返回,如果没有,执行下一步。
通过分析器进行词法分析,提取 sql 语句的关键元素,比如提取上面这个语句是查询 select,提取需要查询的表名为 student,需要查询名为name的列,查询条件是这个表的 age=’18’和sex=‘女’。
判断这个 sql 语句是否有语法错误,比如关键词是否正确等等,如果错误就执行下一步。
接下来就是优化器进行确定执行方案,上面的 sql 语句,可以有两种执行方案,优化器会根据自己的优化算法选择执行效率最好的一个方案
- 先查询学生表中age为“18”的学生,然后判断是否sex=女。
- 先找出学生中sex=女的学生,然后再判断是否age=18
进行权限校验,如果没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎的执行结果给客户端
总结
权限校验—>查询缓存—>分析器—>优化器—>权限校验—>执行器—>执行引擎