> 文档中心 > Mysql深入学习之Mysql架构分析

Mysql深入学习之Mysql架构分析

文章目录

  • 前言
  • 一、Mysql架构简介
    • 网络连接层
    • 服务层
    • 存储引擎层
    • 系统文件
  • 二、Mysql执行流程
  • 三、InnoDB与MyISAM的区别

前言

对于大多数中小企业来说Mysql可能是他们最倾向的数据库,包括大公司也有很多使用的是Mysql,因为Mysql是免费开源的、体积小使用简单,而且拥有易扩展等特性。但是你对Mysql的了解有多少呢?仅仅是几个SQL语句吗?如果想要自己搭建的数据库的性能更进一步肯定需要对Mysql的底层逻辑有一些简单的认知的,这样才能根据项目情况搭建更加优秀的数据库系统,本文简单的讲解了Mysql的一些基本架构情况,让大家对Mysql有个系统性的认知。

一、Mysql架构简介

在这里插入图片描述
根据Mysql5官网文档中的说明,Mysql从上到下可以分为:网络连接层、服务层、存储引擎层和系统文件层。

网络连接层

网络连接层中主要是客户端连接器,我们可以通过客户端连接器建立与Mysql的连接,客户端连接器支持目前所有主流的编程语言和技术,例如常见的JAVA、C语言、Python以及.NET等编程语言。

服务层

Mysql的服务层主要分为连接池、系统管理和控制工具、SQL接口、解析器、查询优化器和缓存六个部分。

  1. 连接池: 连接池不用多说了,大家都了解,类似于线程池的东西,负责存储和管理客户端与数据库之间的连接。
  2. 系统管理和控制工具: 系统管理和控制工具主要用来做备份恢复、安全管理和集群管理等操作的。
  3. SQL接口: SQL接口是用来接收客户端发送的SQL命令,并且返回执行后的结果的,这就好比是Controller。
  4. 解析器: 解析器主要负责将请求的SQL解析为语法树,然后根据Mysql中的规则检查语法树是否合法。
  5. 查询优化器: 当解析器验证语法树没有问题后就到了查询优化器,查询优化器会将其转化为多个执行计划,并且选择其中最优的计划然后交由存储引擎执行。
  6. 缓存: 缓存就不用说了大家都知道干啥的,就是执行了SQL语句将查询结果放到缓存中,下次查询先到缓存中去获取,获取不到再让存储引擎去查。

存储引擎层

存储引擎层主要负责执行Mysql中的计划,包括DDL对表的操作和DML对数据的操纵等,其实这就好比Dao层,前面的都是逻辑准备处理,到了这里真正的执行命令去操作。Mysql提供了可拔插式的多种存储引擎,例如最常见的InnoDB和MyISAM。

系统文件层

系统文件层是数据库存储数据的地方,是文件的物理存储层,主要包含日志文件、数据文件、PID文件和Socket文件等。

  1. 日志文件:日志文件保存的是平常对数据库操作的日志,例如错误日志、查询日志、log bin二进制日志、慢查询日志等。可以通过对应的SQL命令查看相应的日志信息。
  2. 数据文件:数据文件就是平常存取的数据保存的文件,常见的字符集和校验规则的文件db.opt文件、InnoDB存放数据对应的文件,其中独享表空间使用.ibd文件来存放数据,没一张表对应一个.ibd文件,共享表空间使用.ibddata文件来存放,所有的表都共同使用一个或多个.ibdata文件。
  3. 配置文件:配置文件指的是保存对Mysql的配置信息的文件,比如我们安装Mysql的时候经常修改的my.cnf文件、myini文件等。

二、Mysql执行流程

根据MySQL的各个组件的功能介绍我们大致可以画出这样一个流程图来描述Mysql的执行流程。
在这里插入图片描述

  1. 首先客户端与Mysql建立连接,Mysql中连接的通讯机制使用的是半双工模式(全双工可以同时发送接收信息,半双工同一时间只能发送或接收消息,单工只能发送或者只能接收数据)。
  2. 建立连接后先到缓存中去查询数据,如果有数据则直接返回。Mysql8中直接干掉了缓存,因为Mysql自带的缓存不怎么好用,而且很多项目都使用第三方缓存了。
  3. 如果缓存中不存在则把查询SQL发送到解析器,解析成解析树,解析生成的语法树会被预处理器进一步校验,通常我们写的SQL错误就是预处理器校验失败。
  4. 校验正常的解析树到达查询优化器生成最优的执行计划,在这期间查询优化器会根据很多优化策略优化语法树,可能生成多条执行计划,最终选择最优的执行计划。
  5. 生成的最优执行计划交由查询执行引擎去执行,此时查询执行引擎会根据SQL语句进行判断调用对应的API接口与存储引擎进行交互。
  6. 存储引擎根据传递进来的API接口去数据文件或缓存池中去查找对应的数据,并且返回。
  7. 查询执行引擎获取到对应的查询数据,根据数据库配置选择是否将数据保存到数据库缓存中,并且返回查询结果。

三、InnoDB与MyISAM的区别

在Mysql中一般常用的存储引擎也就是InnoDB和MyISAM了,其他的存储引擎可能根据项目情况有选择用的,但是MyISAM由于不支持事务所以在MySQL8同样被干掉了。但是在很对面试的时候还是会问到InnoDB与MyISAM的区别:

  • InnoDB支持事务和外键;MyISAM不支持事务和外键。
  • InnoDB支持行级锁;MyISAM支持表级锁。
  • InnoDB使用聚集索引;MyISAM使用非聚集索引。
  • InnoDB表对应两个文件:.frm表结构文件与.ibd数据文件;MyISAM表对应三个文件:.frm表结构文件,、MYD表数据文件和.MYI索引文件。