MySQL逻辑架构图分析

MySQL逻辑架构图分析_第1张图片

MySQL逻辑架构图

大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。

Server层:

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

存储引擎层:

存储引擎是MySQL数据库的核心,是底层物理结构的实现,负责MySQL中数据的存储和提取。

MySQL数据库区别于其它数据库的一个最主要的特点是其基于表的插件式存储引擎(InnoDB、MyISAM、Memory、Archive、NDB等),目前最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。

每个存储引擎都有它的优势和劣势,Server层通过API与存储引擎层进行通信。

连接器

负责客户端跟服务器建立连接、身份认证(用户名、客户端IP、密码是否正确 / 证书是否正确等)、权限验证、维持和管理连接等操作。

查询缓存

在MySQL查询缓存开关开启的前提下,MySQL会将执行过的查询语句和结果,以key-value的形式,缓存在内存中的一个引用表中。

key为包含查询语句、数据库信息、客户端协议版本等影响查询结果的信息的哈希值,value为查询结果。

当MySQL服务端接收到一条SQL语句时,先通过一个大小写不敏感的检查判断SQL语句是否以 SEL 开头,如果是,则检查查询缓存,如果命中缓存,再检测一下用户权限,如果权限满足,MySQL会直接将这个value当作查询结果返回给客户端,而跳过后续的分析、优化、执行等过程。

并不是所有的查询语句和结果都会被缓存,当查询语句中有一些不确定的数据时,则不会被缓存。例如查询语句中包含NOW()、CURRENT_DATE、CURRENT_USER()等函数,因为每次查询返回的结果可能不同,所以不会被缓存。事实上,如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL中的系统表或者任何包含列级别权限的表,则都不会被缓存。

SELECT语句没有从查询缓存中返回数据的情况称为 “缓存未命中” ,缓存未命中可能有如下几种情况:

  • 查询语句之前没有被执行过,所以也未曾被缓存过;
  • 查询语句中包含不确定的函数等,导致无法被缓存;
  • 查询语句对应的查询结果太大,导致无法被缓存;
  • 虽然之前被缓存过,但因为查询缓存的内存空间耗尽,导致某些缓存被“逐出”;
  • 数据表被修改(如执行过update语句),则导致此表对应的所有缓存被清空;
  • 此次查询语句跟之前执行的查询语句有任何的字符上的不同,例如空格、注释等不同,也会导致缓存不命中。

查询缓存带来的并不都是系统性能的提升,同时也会带来额外的消耗:

  • 每次查询执行时,都会先检查是否命中查询缓存;
  • 如果一个查询可以被缓存,并且之前还未被缓存过,则在执行完成后,会将本次查询及结果存入查询缓存中,这会带来额外的系统消耗;
  • 当某个表被更新时,MySQL会将对应表的所有缓存都设置失效。如果表数据更新频繁或者查询缓存特别大,这个操作可能会带来很大的系统消耗。

当查询缓存带来的资源节约大于其本身造成的资源消耗时才会给系统带来性能提升。对于不经常更新的数据来说,使用缓存还是可以的。

需要注意的是,MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻底没有这个功能了。

分析器

分析器负责SQL语句解析和语法规则校验等。

分析器会先做 “词法分析” 。输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么,如关键字、表名、列明等。

做完 “词法分析” ,分析器就要做 “语法分析” 。根据词法分析的结果,语法分析器会根据语法规则,判断输入的这个 SQL 语句是否满足 MySQL 语法:

  • 是否使用了错误的关键字,如SELCT;
  • 关键字顺序是否正确,如 FROM 在 WHERE 前边;
  • 引号是否前后匹配;
  • 数据表以及数据列是否存在;
  • 名字和别名是否有歧义;
  • 对某字段的运算是否允许,例如不能对一个整数使用 SUBSTRING() 函数。

最后还会进行权限校验。

优化器

优化器负责将分析器生成的 “语法树” 转化成执行计划。一条查询可以有很多种执行方式,最后都会返回相同的结果,优化器的作用就是找到其中最好的执行计划。

MySQL的查询优化器是一个非常复杂的部件,它使用了很多优化策略来生成一个最优的执行计划:

  • 重新定义关联表的顺序
  • 将外连接转化为内连接
  • 使用等价变换规则(如,where a > 100 and a > 200 会转化为 where a > 200;where a < b and a = 5 会转化为 where b > 5 and a = 5等)
  • 优化 COUNT()、MIN()、MAX()
  • 覆盖索引扫描(当索引中的列包含所有查询需要使用的列的时候,MySQL就可以使用索引返回需要的数据,而无需再查询对应的数据行)
  • 子查询优化
  • 提前终止查询
  • 查询条件中有多个索引的时候,决定使用哪个索引

执行器

执行器负责根据优化器生成的执行计划来完成整个查询。MySQL执行器根据执行计划给出的指令逐步执行,其中大量的操作需要通过调用存储引擎实现的接口来完成。如,查询某个索引第一行的接口、查询某个索引条目下一条目的接口等。

小结

以上就是MySQL逻辑架构的大体介绍。掌握MySQL的逻辑架构,对于以后深入了解MySQL数据库会有极大的帮助。

你可能感兴趣的:(MySQL,MySQL逻辑架构,MySQL基础架构,MySQL结构图,MySQL架构分析,MySQL组件)