MySQL系列四之执行流程及架构

前面几篇主要讲了MySQL一些实际上的使用,但是对整个mysql架构上的一些还是不够了解,熟悉mysql的架构还是对于我们很有帮助的。MySQL体系结构描述了MySQL系统的不同组件之间如何相互联系。MySQL体系结构基本上是一个客户端-服务器系统。MySQL数据库服务器是服务器,连接到MySQL数据库服务器的应用程序是客户端。

执行流程

我们执行一条sql语句的时候,MySQL的执行流程是怎么样的呢?

  1. MySQL客户端通过协议将SQL语句发送给MySQL服务器。

  2. MySQL服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。

  3. MySQL服务器服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划。(查询缓存默认不开启)

  4. MySQL根据优化器生成的执行计划,再调用存储引擎的API来执行查询。

  5. 将结果返回给客户端,如果开启查询缓存,则会备份一份到查询缓存中。

知道执行流程之后,我们看下MySQL的架构图。

mysql 逻辑架构主要分为三层

  1. 应用层
    • 这一层是在体系结构中的最顶层,可以在许多客户端-服务端体系结构中看到同一层。这一层包括一些大多数客户端-服务端应用程序共有的服务。从架构图中我们可以看到Client Connections 和Connect Pool。
  2. 核心服务层
    • 该层负责MySQL关系数据库管理系统的所有逻辑功能。MySQL服务器的大脑位于这一层。包括查询解析、分析、优化、缓存、内置函数(比如 : 时间、数学、加密等函数),所有的跨存储引擎的功能也在这一层实现 : 存储过程、触发器、视图等
  3. 存储引擎层
    • 可插入的存储引擎功能使MySQL成为大多数开发人员的独特且首选的选择。插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。MySQL使我们可以根据不同的情况和要求选择各种存储引擎。

架构服务

应用层的服务

链接处理

MySQL首先是一个网络程序,其在TCP之上定义了自己的应用层协议。所以要使用MySQL,我们可以编写代码,跟MySQL Server建立TCP连接,之后按照其定义好的协议进行交互。当然自己编写代码是比较麻烦的,我们也可以直接通过SDK进行链接如JDBC,ODBC等。当客户端连接到服务器时,客户端将获得自己的线程进行连接。来自该客户端的所有查询在该指定线程内执行。该线程由服务器缓存,因此不需要为每个新连接创建和销毁它们。

身份验证

每当客户端连接到MySQL服务器时,服务器都会在服务器端执行身份验证。身份验证基于用户名,客户端主机和客户端用户密码。

安全

客户端成功连接到MySQL服务器后,服务器将检查该特定客户端是否具有对MySQL服务器发出某些查询的特权。

核心服务层的服务

MySQL服务和实用程序

MySQL相对提供了广泛的服务和实用程序。这是MySQL普及的主要原因之一。该层提供了用于管理和维护MySQL系统的服务和实用程序。

  • 备份和恢复
  • 安全
  • 复制
  • 分区
  • 工作台
SQL接口

SQL是一种查询语言,用于查询Mysql 服务器,它是在MySQL客户端用户和服务器之间进行交互的工具。支持DML(数据操作语言)、DDL(数据定义语言)、存储过程、视图、触发器、自定义函数等多种SQL语言接口。

解析器

MySQL会解析SQL查询,并为其创建语法树,并根据数据字典丰富查询语法树,会验证该客户端是否具有执行该查询的权限。创建好语法树后,MySQL还会对SQl查询进行语法上的优化,进行查询重写。具体步骤如下:

  • 在解析常规语句时,首先进行词法分析(从字符流中生成单词或标记)。
  • 语法分析(使“句子”成为可能),语义分析(确保使这些句子确实有意义)和代码生成(对于编译器而言)在所有代码阶段都一次完成。
优化器

语法解析和查询重写之后,MySQL会根据语法树和数据的统计信息对SQL进行优化,包括决定表的读取顺序、选择合适的索引等,最终生成SQL的具体执行步骤。这些具体的执行步骤里真正的数据操作都是通过预先定义好的存储引擎API来进行的,与具体的存储引擎实现无关

缓存

MySQL缓存(查询缓存)存储SELECT 语句的完整结果集。甚至在解析查询之前,MySQL服务器都会查询查询缓存。如果任何客户端发出的查询与缓存中已经存在的查询相同,则服务器仅跳过解析,优化甚至执行,它仅显示缓存中的输出。

存储引擎层的服务

存储引擎的具体实现,这些存储引擎都实现了MySQl定义好的存储引擎API的部分或者全部。MySQL可以动态安装或移除存储引擎,可以有多种存储引擎同时存在,可以为每个Table设置不同的存储引擎。存储引擎负责在文件系统之上,管理表的数据、索引的实际内容,同时也会管理运行时的Cache、Buffer、事务、Log等数据和功能。

-- 查看MySQL支持的存储引擎
SHOW ENGINES;

MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表。

InnoDB

InnoDB引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择:

  1. 更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。
  2. 事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。
  3. 自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。
  4. 外键约束。MySQL支持外键的存储引擎只有InnoDB。
  5. 支持自动增加列AUTO_INCREMENT属性。
MyISAM

在5.1之前,MyISAM是默认的引擎,MyISAM有大量的特心态,包括全文索引、压缩、空间函数。但是MyISAM不支持事务和行级锁,而且在崩溃后无法安全恢复。即使后续版本中MyISAM支持了事务,但是很多人的概念中依然是不支持事务的引擎。

MyISAM存储引擎特别适合在以下几种情况下使用:

  1. 选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。
  2. 插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据。

更多引擎介绍

本文参考:https://www.rathishkumar.in/2016/04/understanding-mysql-architecture.html

https://zhuanlan.zhihu.com/p/53619907

https://www.cnblogs.com/qq1148932219/p/11694064.html


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!