MySQL 逻辑架构以及请求处理
MySQL请求处理流程
MySQL经典架构示意
连接器(Connectors)
客户端访问MySQL服务器前,首先建立TCP连接。握手完成后,连接器开始通过用户名和密码进行身份验证。
- 用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行
- 用户名密码认证通过,会从权限表查出账号拥有的权限与连接关联,之后的权限判断逻辑,都将依赖于此时读到的权限
当TCP收到请求后,会从线程池中分配一个线程专门与请求客户端交互。连接都从线程池中获取线程,节省创建和销毁线程开销。
这意味着当用户权限修改后,不会影响已连接线程的权限。必须重新连接才能获取到新的权限设置
可以通过show processlist和 show full processlist 查看当前用户占用的线程,如果是root用户可以看到所有用户的线程,show processlist只能列出当前100条。
建议看一下下面的官方介绍,很重要也很常用的命令。
SQL接口(SQL interface)
-
接受用户的SQL命令,并且返回用户需要查询的结果
-
MySQL支持DML(数据操作语言)、DDL(数据定义语言)、存储过程、视图、触发器、自定 义函数等多种SQL语言接口
查询缓存(Caches & Buffers)
从MySQL 5.7.20开始,不推荐使用查询缓存,并在 MySQL 8.0中删除 。
删除分析可以看一下 mysql-8-0-retiring-support-for-the-query-cache
分析器(Parser)
- 在解析器中对 SQL 语句进行词法分析、语法分析。将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。如果在分解构成中遇到错误,那么就说明这个SQL语句是不合理的。
- 词法分析: 识别完整SQL语句中各个单词的关键字识别,例select关键字查询语句,from后面是表名
- 语法分析: 根据语法规则判断输入的SQL语句是否满足MySQL语法
- 在SQL命令传递到解析器的时候会被解析器验证和解析,并为其创建语法树,并根据数据字典丰富查询语法树,会验证该客户端是否具有执行该查询的权限。创建好语法树后,MySQL还会对SQL查询进行语法上的优化,进行查询重写。
优化器(Optimizer)
- SQL语句在语法解析之后、查询之前会使用查询优化器确定SQL语句的执行路径,生成一个执行计划。
- 这个执行计划表明应该 使用哪些索引 进行查询(全表检索还是使用索引检索),表之间的连接顺序如何,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将 查询结果返回给用户。
可以通过explain查看执行计划,通过Profiling检查各个步骤耗时。
发现没有命中意向生效的索引,此时可以基于optimizer trace 查看详细执行计划生成过程去分析。
执行器
根据优化器选择的执行方案,去调用存储引擎执行
- 开始执行的时候,要先判断一下对这个表有没有执行查询的权限
- 如果没有,就会返回没有权限的错误
- 如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。
插件式存储引擎层( Storage Engines)
真正的负责了MySQL中数据的存储和提取,对物理服务器级别 维护的底层数据执行操作,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同。
基于 MySQL 8.0.26