![mysql 架构](/assets/wp-content/uploads/2019/04/未命名文件-46.png)
Mysql架构

概览

本篇文章将会带领你了解mysql从客户端登陆到一条SQL指令完成的过程中一共做了哪些操作,通过浅析这个过程中的各个步骤,从而基本认识到mysql的基础架构和实现原理。

MYSQL基础架构

  • MYSQL客户端:包括Command-Line、Mysql Workbench以及Navicat等等工具。
  • 连接器:连接管理和权限认证
  • 分析器: 词法分析和句法分析
  • 缓存: 按照Key-Value的形式存储SQL语句以及查询结果
  • 优化器: 选择索引以及决定表的连接顺序
  • 执行器: 权限校验以及调用存储引擎的接口
  • 存储引擎: 包括Myisam、InnoDB等等,用于数据存储以及提供接口

示例

select * from user where ID=1;

上述这条SQL语句是我们最常见的数据库操作之一。在让MYSQL根据SQL执行操作之前,首先要登陆到MYSQL,最常见的就是通过mysql -u$user -p登陆到本地MYSQL。连接器此时会利用输入的用户名和密码认证,如用户名和密码认证通过,则会通过相应的权限表获取输入用户的权限。

连接建立以后,MYSQL根据请求查询缓存。之前执行过的查询语句和结果会通过Key-Value的形式缓存在内存中。如果缓存命中,则直接返回。倘若缓存所在表更新,那么缓存就会被清空。但是在对静态表的查询上,缓存有较好的表现,比如长期不会进行的更新的项目配置表。

在缓存命中失败后,该请求将进入分析器。分析器主要进行“词法分析”和“语法分析”。所谓词法分析就是检查关键字,然后将对应的sql语句解析成内部的数据结构,以方便进行优化和生成执行计划。在这里特别注意的是,mysql在词法分析的时候就会进行数据库内表的检索和表内字段的检索,如果sql语句所要查询的表或者表内字段不存在,那么错误在此时抛出。词法分析之后分析器会进行语法分析,所谓语法分析就是MYSQL会检查sql语句是否符合语法。

经过分析器之后,MYSQL已经意识到做什么了。那么接下来处理的是怎么做的问题,在mysql的单个表中,一般会同时存在多个索引。对于同一个查询,不同的索引,甚至是全表扫描的效率有所不同。优化器此时就要对索引和join的顺序的进行选择,其中选择的指标是进行磁盘的io次数。

在知道如何做之后,此时请求进入执行器,执行器首先会进行权限校验,如果用户对该表不具有请求所对应操作的权限,此时会抛出错误。权限校验成功之后,执行器会调用引擎提供的接口。其中具体的执行流程如下:

  1. 首先取该表的第一行数据,判断ID值是否为1,是则加入结果集,不是则跳过。
  2. 继续调用引擎接口获取“下一行”,重复第一步的判断操作。
  3. 将结果集返回给客户端。

至此,这条sql语句就执行完成了。