mysql架构与存储引擎

178 阅读4分钟

Mysql架构

image-20200623160619661

连接认证层

当mysql启动(mysql服务器就是一个进程),等待客户端连接,每个客户端连接请求,服务器都会新建一个线程处理(如果是线程池的话,就会分配一个空线程),每个线程独立,拥有自己的内存空间,但是如果这个请求只是查询,没关系,但若修改数据,很显然,当两个线程修改同一块内存会引发数据问题

image-20200623161016995

连接到服务器,服务器需要对其进行验证,也就是用户名 IP 密码验证,一旦连接成功,还需要验证某个特定查询的权限(例如是否运行客户端堆某张表,某个库操作等)。

image-20200623161303782

Sql处理层

image-20200623162010326

这一层主要的功能有,Sql语句的解析,优化,缓存的查询,MySql内置函数的实现,跨存储引擎功能(就是说每个存储引擎都需提的供功能,引擎对外提供接口),例如触发器,存储过程,视图等。

  1. 如果是查询语句,首先会查询缓存是否有响应的结果,有则返回结果,无则进行下一步(不是查询语句直接进行下一步)

分为缓存Sql和缓存结果,缓存Sql即Sql一样就不需要在进行解析优化了,缓存结果一般不开启

  1. 解析查询,创建一个内部数据结构(解析树),这个数据结构主要用于sql语句的语义和语法解析

    image-20200623162439803
  2. 优化,优化Sql语句,例如重写查询,决定表的读取顺序,以及选择需要的索引等,这一阶段是用户可以查询的,查询服务器优化器是如何优化的,便于用户重构查询以及修改相关配置,达到最优化 ,这一阶段还涉及到存储引擎,优化器会询问存储引擎,比如某个操作的开销信息,是否针对特定的索引优化等。

    image-20200623162512008

存储引擎

查看存储引擎

show engine

查看默认存储引擎

show viriables like‘%storage_engine%’

MyISam

Mysql5.5以前的默认存储引擎

MyISAM的数据文件有MYD和MYI组成,分别代表了数据文件以及索引文件

所有的存储引擎都存在frm文件,代表了数据表的定义与结构

特点:

  • 并发与锁级别:表级别
  • 支持全文检索
  • 支持数据压缩(myisampack -b -f testmyisam.MYI),压缩的数据是只读的,如果修改,还是得操作为压缩的数据文件

适用场景:

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

InnoDB

Mysql5.5及以后默认存储引擎,

innodb_file_per_table

  • on. tablename.ibd 独立表空间(每个表有自己的数据文件)
  • Off indataX 系统表空间(即所有表的数据存在一个文件里面)

mysql5.6之前默认为系统表空间,系统表空间与嘟噜表空间区别

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

j建议使用独立表空间

特点:

  • 支持事务,完全支持书屋ACID特性
  • Redo log和Undo log
  • 支持行级锁(并发程度更高)

适用场景:大部分OLTP应用

InnoDb与MyISAM对比

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

CSV

特点

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

Archive

组成:

  • 以zlib对数据表进行压缩,磁盘IO跟少
  • 数据存在以arz文件中

特点

  • 只支持insert和select
  • 只允许在自增列上加索引

适用场景:日志记录

memory

  • 文件系统存储特点,也曾heap存储引擎,所有数据保存在内存中
  • 支持Hash索引和BTree索引
  • 所有字段都是固定长度(varchar(10)= char(10))
  • 不支持blob Text等大字段
  • 使用的是表级锁
  • 最大大小有max_heap_table_size

image-20200623165519231

使用场景:

  • hash索引用于查找或者映射表
  • 用于保存数据分析长生的中间表
  • 用于缓存周期性聚合数据结果表

Ferderated

特点

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