体系架构

mysql是由多个子系统构成的层次化系统,体系结构如下图所示

mysql体系架构 mysql体系结构详解_存储引擎

组件名称

组件作用

Connectors

用来与客户端应用程序建立连接的数据库接口。比如我们常用的mysql-connector-java

Management Services&Utilities

系统管理与服务控制相关的辅助工具

Connection Pool

负责处理与用户访问有关的用户登录,线程处理,内存和进程缓存需求

SQL Interface

提供从用户接收命令并把结果返回给用户的机制

Parser

针对SQL语句进行语法分析和解析,构建一个用来查询的数据结构

Optimizer

优化查询语句,是对数据检索动作的效率的非常接近的优化

Caches&Buffers

保证使用最频繁的数据能够以最高效率的方式被访问,提供的缓存方式:表缓存、记录缓存、键缓存、权限缓存、主机名缓存

Pluggable Storage Engines

插件式的存储引擎。底层物理结构的实现,负责数据库执行实际的I/O操作,基于表结构,不是基于数据库的,可以为不同的表定制不同的存储引擎。其核心是一个抽象的文件访问接口,所以存在第三方实现的存储引擎,利用这个文件访问接口建立的新的文件访问机制

File system

主要负责将数据库的数据存储在文件系统之上,并完成与存储引擎的交互

1、连接层

mysql体系架构 mysql体系结构详解_存储引擎_02


当mysql启动(mysql服务器就是一个进程),等待客户端连接,每一个客户端连接,服务器都会分配一个空的线程,每个线程独立拥有各自的处理空间。mysql的最大连接数是可以通过修改配置文件或者执行命令进行设置的

#查看最大连接数
SHOW VARIABLES LIKE '%max_connections%'

客户端连接到服务器,服务器需要进行验证(IP,用户名,密码等),连接成功后需要进行权限认证,即当前连接能够操作某个库或者某个表等

mysql体系架构 mysql体系结构详解_存储引擎_03

2、SQL处理层

这一层的主要功能有:SQL语句的解析、优化、查询等。

SQL的执行流程如下:

mysql体系架构 mysql体系结构详解_缓存_04


注:如果开启了查询缓存,返回结果的同时会把SQL查询结果放入缓存中。

  1. 如果是select语句,如果开启了缓存会先查询缓存有则直接返回结果,没有则执行下一步(如果不是select语句 则直接执行下一步)
#查看是否开启了查询缓存   默认不开启
SHOW VARIABLES LIKE '%query_cache_type%';
#查看查询缓存大小
SHOW VARIABLES LIKE '%query_cache_size%';

注:查询缓存只能在配置文件中进行开启,生产环境不建议开启,除非业务中真经常有大量的相同查询建议开启

  1. 解析查询:创建一个内部解析树,主要用来SQL语句的语义及语法解析
  2. 优化:优化SQL语句,例如重写查询,决定表的读取顺序,以及选择需要的索引等;sql 解析器会通过优化器来优化程序员写的 sql

3、物理存储结构

#查看数据存放的路径
show variables like 'datadir';

打开文件夹后我们会看到mysql相关的一些文件

mysql体系架构 mysql体系结构详解_数据库_05


创建一个数据库之后 在这个文件夹中会多一个对应的文件夹

mysql体系架构 mysql体系结构详解_存储引擎_06


mysql体系架构 mysql体系结构详解_mysql_07


用户建立的表信息都会在上面的那个目录中,它和具体的存储引擎有关(此处就不一一展开了),都都会有个frm文件 存放的是表的数据结构。

mysql体系架构 mysql体系结构详解_数据库_08


迁移数据的时候可以考虑通过替换数据库文件的方式完成 速度还可以

4、存储引擎

#查看mysql提供的存储引擎
show engines;
#查看默认的存储引擎
SHOW VARIABLES LIKE '%storage_engine%';

4.1 MyISAM

MySQL5.5之前默认的存储引擎。
适用场景:

  • 非事务型应用(数据仓库、报表、日志数据等)
  • 只读类应用
  • 空间类应用(空间函数,坐标等)

innodb越来越强大,myisam已经停止维护(很多场景都不适合使用)

4.2 Innodb

  • 事务性存储引擎
  • 完全支持事务的ACID特性
  • Redo Log、Undo Log
  • Innodb支持行级锁

对比项

MyISAM

Innodb

主外键

不支持

支持

事务

不支持

支持

行表锁

表锁,即时操作一条操作记录也会锁整个表 不适合高并发操作场景

行锁,操作时只锁某一行,不对其他行有影响,适合高并发操作场景

缓存

只缓存索引,不缓存真实数据

不仅缓存索引还缓存真实数据,对内存要求较高而且对内存大小、性能有关系

4.3 CSV

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

4.4 Archive

  • 组成
    以 zlib 对表数据进行压缩,磁盘 I/O 更少
    数据存储在 ARZ 为后缀的文件中
  • 特点
  • 只支持 insert 和 select 操作
    只允许在自增 ID 列上加索引

4.5 Memory

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

使用场景

  • hash 索引用于查找或者是映射表(邮编和地区的对应表)
  • 用于保存数据分析中产生的中间表
  • 用于缓存周期性聚合数据的结果表

4.6 Ferderated

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

使用场景:偶尔的统计分析及手工查询(某些游戏行业)