MySQL——MySQL逻辑架构

47 阅读7分钟

本文正在参加「技术专题19期 漫谈数据库技术」活动

MySQL基础逻辑架构图:

img

1、Connectors 客户端连接层

客户端连接层 Connectors,位于MySQL体系架构的最上层,提供与MySQL服务器建立连接的能力,是一些客户端和连接服务,包含本地服socket通信和大多数基于C/S工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证及相关的安全方案。

MySQL首先是一个网络程序,在TCP之上定义了自己的应用层协议。所以要使用MySQL,我们可以编写代码,跟MySQLServer建立TCP连接,之后按照其定义好的协议进行交互。或者比较方便的办法是调用SDK,比如Native C API、JDBC、PHP等各语言MysQL Connector,或者通过ODBC。但通过SDK来访问MySQL,本质上还是在TCP连接上通过MySQL协议跟MySQL进行交互。

2、第一层:Connection Pool 连接池

主要负责存储和管理客户端与数据库的连接信息,连接池里的一个线程负责管理一个客户端到数据库的连接信息。

负责监听对 MySQL Server 的各种请求,接收TCP连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信, 接受客户端的命令请求,传递 Server 端的结果信息等。

线程池则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。每一个连接都从线程池中获取线程,省去了创建和销毁线程的开销。

3、第二层:SQL服务层

第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行。所以跨存储引擎的功能也在这一层实现,如过程、函数等。

在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化︰如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。

如果是SELECT语句,服务器还会查询内部缓存。如果缓存空间足够大,这样在解决大量读操作的环境中能够很好地提升系统性能。

SQL Interface:SQL 接口

主要负责接收客户端发送过来的各种SQL命令,并将SQL命令发送到其他部分,并接收其他部分返回的结果数据,将结果数据返回给客户端。比如select from就是调用SQL Interface。

MySQL支持 DML(数据操纵语言)、DDL(数据定义语言)、存储过程、视图、触发器、自定义函数等多种SQL语言接口。

Parser :解析器

SQL命令传递到解析器的时候会被解析器验证和解析。解析器是有 Lex 和 YACC 实现的一个很长的脚本。

在解析器中对SQL语句进行语法分析、语义分析。将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。如果在分解构成中遇到错误,那么就说明这个SQL语句是不合理的。

在SQL命令传递到解析器的时候会被解析器验证和解析,并为其创建解析树,并根据数据字典丰富查询解析树,会验证该客户端是否具有执行该查询的权限。创建好语法树后,MySQL还会对SQL查询进行语法上的优化,进行查询重写。

如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的,语句将不会继续执行下去

Optimizer 查询优化器

SQL语句在查询之前会使用查询优化器对查询进行优化。就是优化客户端请求的 query(sql语句) ,根据客户端请求的 query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略(执行计划)。

这个执行计划告诉后面的程序如何取得这个 query 语句的结果,应该使用哪些索引进行查询,表之间的连接的顺序如何,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正执行查询,并将查询结果返回用户。

他使用的是“选取-投影-连接”策略进行查询:

 select uid,name from user where gender = 1;

这个SELECT查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤; 这个SELECT查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤,将这两个查询条件连接起来生成最终查询结果。

Cache 和 Buffer:查询缓存

查询缓存主要功能是将客户端提交给MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值做一个对应。

该 Query 所取数据的基表发生任何数据的变化之后,MySQL 会自动使该 query 的Cache 失效。在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。

如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。

这个缓存机制是由一系列小缓存组成的。例如:MySQL的表缓存,记录缓存,权限缓存,key缓存、引擎缓存等。

这个查询缓存可以在不同客户端之间共享。

从MySQL5.7.20开始不推荐使用查询缓存,并在 MySQL8.0中删除。

4、第三层:Engine 存储引擎层

MySQL 中的存储引擎层主要负责数据的写入和读取,与底层的文件进行交互。

MySQL 中的存储引擎是插件式的,它根据MySQL AB公司提供的文件访问层的一个抽象接口来定义一种文件访问机制,这种访问机制就叫做存储引擎。

服务器中的查询执行引擎通过相关的接口与存储引擎进行通信,同时,接口屏蔽了不同存储引擎之间的差异。

MySQL 中,最常用的存储引擎就是 InnoDB 和 MyISAM。

MySQL 插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,每个存储引擎开发者都可以按照自己的意愿来进行开发。

注意:存储引擎是基于表的,而不是数据库。

MySQL 5.7默认支持的存储引擎如下:

在这里插入图片描述

5、存储层

所有的数据,数据库、表的定义,表的每一行的内容,索引,都是存在文件系统上,以文件的方式存在的,并完成与存储引擎的交互。当然有些存储引擎比如InnoDB,也支持不使用文件系统直接管理裸设备,但现代文件系统的实现使得这样做没有必要了。在文件系统之下,可以使用本地磁盘,可以使用DAS、NAS、SAN等各种存储系统。

6、小结

MySQL Server 架构简化为三层:

  1. 连接层:客户端和服务器端建立连接,客户端发送SQL至服务器端;
  2. SQL层(服务层):对SQL语句进行查询处理;与数据库文件的存储方式无关;
  3. 存储引擎层:与数据库文件打交道,负责数据的存储和读取。

在这里插入图片描述