Mysql快速学习——《一》: Mysql的基础架构

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

思维导图: mysql

基础架构

mysql基础架构.png
  • 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

(注:部分内容来源于网路和一些学习资料,并非本人原著)

你可能感兴趣的:(Mysql快速学习——《一》: Mysql的基础架构)