mysql Server层架构

Posted by BY KiloMeter on July 18, 2019

mysql的基本架构由两部分组成,一部分是Server层、另一部分是存储引擎部分

Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

存储引擎部分就是我们比较熟悉的InnoDB、MyISAM等引擎了。由于该架构是插件式的,因此可以支持多种引擎。

但是总体来说,就算更换了不同的引擎,但是其server层仍然是相同的,下面对server层的各个部分进行详解

server层

连接器

在你准备连接到数据库上时,第一步就是遇到连接器,连接器负责跟客户端建立连接、获取权限、维持和管理连接。 连接命令相信大家都很熟悉

mysql -u root -p

在输入该命令后,接着输入密码,经过TCP三次握手后,连接器就要开始确认你的身份,如果用户名或者密码不对,则会收到”Access denied for user”的错误 。

如果通过验证,连接器会查出你的权限,之后你的操作是否会超出所赋予的权限,都依赖于此时读到的判断。这也就意味着,一个用户在通过连接器后,如果管理员对该用户的权限进行了修改,也不会立刻生效,只有在该用户重新建立连接后才会生效。

查询缓存

连接建立完成后,就能够使用我们经常用到的select等sql语句了,当mysql遇到查询请求时,会先到缓存看看,之前是否执行过这条语句,之前执行过的语句和结果可能会以key-value的形式存储在缓存中,如果能够在缓存中找到这个key,那么这个value就会被直接返回给客户端。但是不建议对业务表开启缓存功能,因为缓存会在表发生更新时全部清除,所以可能在存储的不少数据时,一条更新语句或者插入语句就会把前面缓存的内容都清掉了,得不偿失。缓存功能比较适合于一些静态表,比如系统配置表,这些很少会发生更新操作的表适合于开启缓存功能。

在Mysql8.0版本后,就已经把查询缓存功能删掉了

分析器

在没有命中缓存后,就来到了分析器,分析器会对sql语句进行解析。这个解析过程和编译原理的解析过程相似,首先是词法分析,词法分析能够解析出你这条语句查询语句还是更新语句,表名、字段,以及对应的表和字段是否存在等内容。做完后就是语法分析,用于判断该语句是否符合sql的语法规则。

优化器

经过分析器后,在开始执行之前,还要经过优化器的处理,优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

执行器

MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。 开始执行的时候,要先判断一下你对这个表有没有执行查询的权限,如果没有,就会返回没有权限的错误(实际上,如果命中缓存的话,在返回结果的时候也会经过权限检查)。

如果有权限的话,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

以select * from T where ID=10为例子

1、调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;

2、调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

3、执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

对于执行过程有使用到索引的表来说,执行逻辑也是一样的,只是调用的是“取满足条件的第一行 ”这个接口,之后循环取“满足条件的下一行 ”,这些接口都是引擎中已经定义好了的