了解mysql的基础架构, 理解大概的实现思想, 更有利与我们知之所以然, 是我们学习mysql起来思路更清晰, 效率更高.
思维导图: mysql
基础架构

1. 连接器
Mysql作为服务器,一个客户端的Sql连接过来就需要分配一个线程进行处理,这个线程会专门负责监听请求并读取数据。
这部分的线程和连接管理都是有一个连接器,专门负责跟客户端建立连接、权限认证、维持和管理连接。2. 解析器
SQL解析,就是按照SQL语法,把我们编写的SQL语句进行词法分析,理解这个SQL需要做什么事情.
比如如下SQL语句,就会被解析器给拆成三步逻辑:
select name, age, birthday from user where userId = '007';
- 查询user表;
- 寻找到userId=007的那条数据;
- 将数据中的name、age、country字段信息提取出来;
- 3. 优化器
MySQL的优化器主要是将SQL经过语法解析/词法解析后得到的语法树,通过MySQL的数据字典和统计信息的内容,经过一系列运算,从而得出一个执行计划树的构成。之后MySQL按照执行树的要求,计算得出结果。
优化器的输入是一个语法树,输出是一个执行树(也称为执行计划),SQL优化器的具体模块参考如下图:
mysql优化器.jpg
准备阶段
-- 名称识别:主要包括将找到并补全对应语句的表名,库名等;
-- 语义检查:通过数据字典如果找不到对应的表名,则直接返回报错;
-- 初级语义变换:主要是根据语义规则,把一些外连接直接转成内连接,子查询EXIST转成IN,然后IN再转成SEMIJOIN等功能。逻辑变换
逻辑变换
-- 否定消除:对于多个表达式的和取或析取范式前面有否定的情况,应将关系条件分解成一个一个的,将外面的NOT消除;
-- 等值常量传递:利用了等值关系的传递特性,为了能够尽早执行下推运算(后面会讲到);
-- 常量表达式计算:对于能够立刻计算出结果的表达式,直接计算结果,并将结果与其他条件尽量提前化简。代价优化准备
基于代价的优化主要是用来确定对于每个表,根据条件是否应用索引,应用哪个索引, 确定多表连接的顺序等问题。为了能够进行代价优化,需要尝试各种可能的方法,从而找到一个代价最小的方法。为了能够比较,就需要给定义一个量化指标。
基于代价的优化,主要是为了确定采用如下哪一种方法(如果当前表存在该功能的条件下):
-- 采用哪种索引: 一个表可能有主键,也可能有外键,需要根据条件确定使用哪个索引;
-- 确定JOIN顺序:不同的JOIN顺序对性能影响极大;
-- 确定子查询的执行策略: MySQL执行子查询有相当多的方式, 具体涉及到代价模型, 代价量化方法. 这里先埋个坑, 后续写个文章展开.
- 4. 执行器
这一步就是根据上一步骤优化器生成的SQL执行方案,去调用存储引擎的接口(InnoDB、mysam)完成SQL语句的执行计划,这个SQL引擎操作的有可能是内存数据,也有可能是磁盘文件。
补充:MySQL 8.0 版本直接将查询缓存的整块功能删掉了,日常也不建议开启使用。
文章标签: #MYSQL基础架构 #MYSQL
(注:部分内容来源于网路和一些学习资料,并非本人原著)

喜欢的朋友记得点赞、收藏、关注哦!!!