MySQL逻辑架构及存储引擎

MySQL逻辑架构及存储引擎

  • 连接层
  • SQL处理层
      • 缓存
      • 解析查询
      • 优化
  • 存储引擎
      • MyISAM
      • InnoDB
      • CSV
      • Archive
      • Memory
      • Ferderated


我们先来简单看一看我们MySQL的架构图,如下:
MySQL逻辑架构及存储引擎_第1张图片


连接层

我们MySQL的连接层主要是架构图中的ConnectorsConnection PoolEnterprise Management Services & Utilities,它主要完成两部分工作:

  1. 当MySQL启动(MySQL服务器就是一个进程),等待客户端连接,每一个客户端连接请求,服务器都会新建一个线程处理(如果是线程池的话,则是分配一个空的线程),每个线程独立,拥有各自的内存处理空间。
    但是,如果这个请求只是查询,没关系,但是若是修改数据,很显然,当两个线程修改同一块内存是会引发数据同步问题的。
    MySQL逻辑架构及存储引擎_第2张图片

  1. 连接到服务器,服务器需要对其进行验证,也就是用户名、IP、密码验证,一旦连接成功,还要验证是否具有执行某个特定查询的权限(例如,是否允许客户端对某个数据库某个表的某个操作)
    MySQL逻辑架构及存储引擎_第3张图片

SQL处理层

SQL处理层主要包括SQL InterfaceParserOptimizerCaches&Buffers ,这一层主要功能有:SQL语句的解析、优化,缓存的查询,MySQL内置函数的实现,跨存储引擎功能(所谓跨存储引擎就是说每个引擎都需提供的功能(引擎需对外提供接口)),例如:存储过程、触发器、视图等。


其主要执行流程如下:
MySQL逻辑架构及存储引擎_第4张图片

  1. 如果是查询语句(select语句),首先会查询缓存是否已有相应结果,有则返回结果,无则进行下一步(如果不是查询语句,同样调到下一步)
  2. 解析查询,创建一个内部数据结构(解析树),这个解析树主要用来SQL语句的语义与语法解析
  3. 优化:优化SQL语句,例如重写查询,决定表的读取顺序,以及选择需要的索引等。这一阶段用户是可以查询的,查询服务器优化器是如何进行优化的,便于用户重构查询和修改相关配置,达到最优化。这一阶段还涉及到存储引擎,优化器会询问存储引擎,比如某个操作的开销信息、是否对特定索引有查询优化等



缓存

首先我们先来看一看缓存的部分,我们要清楚的MySQL默认缓存的是我们的SQL执行语句,而不是查询后的结果数据,但是对于查询后的数据我们也是可以将其开启的,我们可以先看看MySQL是否开启了数据缓存(默认不开启)
MySQL逻辑架构及存储引擎_第5张图片

我们可以通过配置文件my.ini进行开启其数据缓存及设置其缓存的大小(需重启MySQL服务)
query_cache_type = 1
query_cache_size = 600000


当然我们也可以通过命令行来进行设置,不过重启后就需要重新设置
set global query_cache_type = 1;
set global query_cache_size = 600000;


设置完成后我们就可以进行查看上述命令查看是否成功开启了,还可以查看去缓存的大小,如下:
show variables like '%query_cache_size%'


解析查询

我们在查询SQL语句前,先经过了查询缓存的那一步,如果没有相应的缓存,我们会进行下一步解析查询,为什么会对我们的SQL语句进行解析呢?因为我们每个人写的SQL都是不一样的,MySQL会对SQL语句进行解析,使其按照特定的流程进行执行,如下:
MySQL逻辑架构及存储引擎_第6张图片


优化

MySQL还会对我们的SQL语句进行一些优化,比如select * from tableName where 1 = 1这个语句,我们的MySQL在执行过程中就会对其进行优化,会去除其where条件后的语句。


再比如我们一张表中,如果设置了id为主键,那么就意味着其id不可能为空,那么我们在查询select * from tableName where id is null类似的语句时,那么它就不会去查询我们的表,我们可以通过explain进行验证
在这里插入图片描述


存储引擎

我们可以查询一下MySQL现在已提供什么存储引擎,如下
MySQL逻辑架构及存储引擎_第7张图片

查看MySQL当前默认的存储引擎:
MySQL逻辑架构及存储引擎_第8张图片

MyISAM

MySQL5.5之前默认的存储引擎,MyISAM 存储引擎由MYD和MYI组成
MySQL逻辑架构及存储引擎_第9张图片

我们可以在MySQL目录下的data文件夹下找到对于的数据库下的表
在这里插入图片描述

  • .frm: 存储表结构,是任何引擎都具备的
  • .MYD: 数据文件
  • .MYI: 索引文件

我们可以看出MyISAM引擎中其数据文件和索引文件是分开进行存储的,所以MyISAM又称为非聚簇索引


MyISAM特性:

  1. 并发性与锁级别——表级锁
  2. 支持全文检索
  3. 支持数据压缩

这里我们主要来看一下其第3点,支持数据压缩,我们来看一看它是如何进行数据压缩的,其实就是在MySQL的bin目录下,如下:
MySQL逻辑架构及存储引擎_第10张图片

我们可以使用 myisampack -b -f xxx.MYI 进行压缩,如下
MySQL逻辑架构及存储引擎_第11张图片

不过我们本来就没有存储任何的数据,所以看不出其空间上大小的变化,但是我们会发现多出了一个 .OLD 的文件,如下:
MySQL逻辑架构及存储引擎_第12张图片

注意:我们压缩完之后,可以删除或备份其.OLD文件,但是有可能压缩会导致我们的数据出现问题,如不能进行修改或新增等,这里我们可以使用CHECK table 表名进行检查,使用REPAIR table 表名进行修改操作。


MyISAM适用场景:

  1. 非事务型应用(数据仓库,报表,日志数据)
  2. 只读类应用
  3. 空间类应用(空间函数,坐标)

InnoDB

MySQL5.5以及以后版本默认存储引擎,MySQL5.6以前默认为系统表空间,MySQL5.6及其以后默认为独立表空间。那么什么是系统表空间和独立表空间呢?我们先来通过innodb_file_per_table查看一下我们MySQL是哪一种
MySQL逻辑架构及存储引擎_第13张图片
ON:独立的表空间:tablename.ibd
OFF:系统表空间:ibdataX


上述我们可以看出我们使用的是独立表空间,这里我们查看一个数据库,如下:
MySQL逻辑架构及存储引擎_第14张图片

同样的,我们可以在MySQL目录下的data文件夹下找到对于的数据库下的表
在这里插入图片描述

  • .frm: 存储表结构,是任何引擎都具备的
  • .ibd: 数据文件和索引文件

我们可以看出InnoDB引擎中其数据文件和索引文件是在同一个文件中进行存储的,所以InnoDB又称为聚簇索引


看完了独立表空间的例子,那么我们的系统表空间呢?这里我们先将数据库设置为系统表空间 set global innodb_file_per_table=off;

然后我们同样建立一个Innodb引擎的表 innodb2,然后我们同样去查看其文件结构
在这里插入图片描述

我们发现独立表空间下的表只有.frm文件,那么它的数据文件和索引文件存储在什么地方的呢?其实它就是存储在我们系统统一的位置,如下:
MySQL逻辑架构及存储引擎_第15张图片

这里我们一般建议使用独立表空间,因为

  • 系统表空间无法简单的收缩文件大小
  • 独立表空间可以通过 optimize table 表名 收缩系统文件
  • 系统表空间会产生IO瓶颈
  • 独立表空间可以同时向多个文件刷新数据

InnoDB的特性及适用场景:

  • InnoDB是一种事务性存储引擎
  • 完全支持事务得ACID特性
  • Redo Log和Undo Log
  • InnoDB支持行级锁(并发程度更高)
  • 适合于大多数OLTP应用(联机事务处理)


MyISAM引擎和InnoDB引擎就是我们日常工作中最常用的两种数据库引擎,我们来比较一下

对比项 MyISAM InnoDB
主外键 不支持 支持
事务 不支持 支持
行表锁 表锁,即使操作一条记录也会锁住整个表
不适合高并发的操作
行锁,操作时只锁某一行,不对其它行有影响
适合高并发的操作
缓存 只缓存索引,不缓存真实数据 不仅缓存索引还要缓存真实数据,对内存要求较高,
而且内存大小对性能有决定性的影响
表空间
关注点 性能 事务
默认安装 Y Y



CSV

MySQL逻辑架构及存储引擎_第16张图片

数据以文本方式存储在文件,如下:

  • .CSV 文件存储内容
  • .CSM 文件存储表得元数据如表状态和数据量
  • .frm 表结构
    MySQL逻辑架构及存储引擎_第17张图片

我们会发现它是以csv文件进行存储的,可以对数据文件直接编辑(保存文本文件内容),这里我们可以先存储一些数据,然后打开进行查看
MySQL逻辑架构及存储引擎_第18张图片
MySQL逻辑架构及存储引擎_第19张图片

当然我们也是可以使用记事本打开,在这其中我们可以直接修改其数据,如下我们使用记事本打开进行修改数据,注意我们在数据的最后的一条记得换行(如果是多列数据,那就是使用 , 逗号进行分割)
MySQL逻辑架构及存储引擎_第20张图片
MySQL逻辑架构及存储引擎_第21张图片

CSV存储引擎特点:

  1. 以csv格式进行数据存储
  2. 所有列都不能为null的
  3. 不支持索引(不适合大表,不适合在线处理)
  4. 可以对数据文件直接编辑(保存文本文件内容)

1和4我们都已经介绍过来,这里我们再看一下第2点和第3点,我们CSV引擎是不支持索引的,下面我们在设计表中直接加上索引进行保存,结果如下:
MySQL逻辑架构及存储引擎_第22张图片


然后我们再来看看所有列都不能为null的特点,它不仅是指我们在存储数据是不能村粗null值,并且在创建表时就必须指定列不为空,否则无法创建表结构,如下:
MySQL逻辑架构及存储引擎_第23张图片


Archive

  • 可以以zlib对表数据进行压缩,磁盘I/O更少
  • 数据存储在ARZ为后缀的文件中

MySQL逻辑架构及存储引擎_第24张图片
MySQL逻辑架构及存储引擎_第25张图片

Archive引擎的特点:

  1. 只支持insert和select操作
  2. 只允许在自增ID列上加索引

使用场景:日志和数据采集应用



Memory

  • 文件系统存储特点,也称HEAP存储引擎,所以数据保存在内存中
  • 支持HASH索引和BTree索引
  • 所有字段都是固定长度 varchar(10) = char(10)
  • 不支持Blog和Text等大字段
  • Memory存储引擎使用表级锁
  • 最大大小由max_heap_table_size参数决定

这里我们可以查看一下默认的max_heap_table_size参数大小,如下:
MySQL逻辑架构及存储引擎_第26张图片

我们建立一个存储引擎和Memory的表,查看其文件就会发现只有一个存储表结构的文件,因为它的数据是存储在内存之中的,所以当服务重启,数据也就没有了。
MySQL逻辑架构及存储引擎_第27张图片


Memory引擎和我们的临时表非常的相似,都是存储在内存之中的,那么有什么不同呢?
MySQL逻辑架构及存储引擎_第28张图片

上图中在系统使用临时表时,会判断是否超过了限制,这里的限制指的是什么呢?就是我们上面说的Memory存储引擎所有字段都是固定长度 varchar(10) = char(10)


另外当我们建立了一张临时表的时候,我们只能在本次会话中进行访问该表,比如我们再新建一个查询,就无法查询刚刚的临时表了,但是我们的Memory引擎是可以的。



Ferderated

  • 提供了访问远程MySQL服务器上表的方法
  • 本地不存储数据,数据全部放到远程服务器上
  • 本地需要保存表结构和远程服务器的连接信息

需要注意的是MySQL的Ferderated引擎默认是关闭的,如下:
MySQL逻辑架构及存储引擎_第29张图片

如果需要使用,我们可以在 my.ini 中使用 federated=1 将其打开,配置好后重启MySQL服务即可,这里我们来看看如何使用该存储引擎


这里我们模拟在远程数据库remote中新建了一张InnoDB的表remote_federated,然后随意插入几条数据
MySQL逻辑架构及存储引擎_第30张图片
MySQL逻辑架构及存储引擎_第31张图片

然后我们模拟在本地数据库localhost中新建一张与远程数据库remote中的remote_federated表类似的localhost_federated表,表中的表结构要保持一致,使用Federated存储引擎,如下:
在这里插入图片描述
其中:CONNECTION = 'mysql://账号:密码@数据库url:端口号/数据库名/表名'

MySQL逻辑架构及存储引擎_第32张图片

我们在文件中发现它其实只存储了表结构,没有存储任何的表数据,它的数据都是全部放到远程服务器上的,当我们在本地数据库新增或删除一条数据,远程数据库中也会随之改变。
MySQL逻辑架构及存储引擎_第33张图片

你可能感兴趣的:(MySQL)