MySQL存储引擎介绍

181 阅读7分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

image-20211026224444391

MyISAM引擎

什么是MyISAM存储引擎

MyISAM存储引擎是MYSQL5.5版本及其以前的默认引擎,MyISAM存储引擎由MYD和MYI文件组成,MYD存储数据文件,MYI存储索引文件,还有一个是所有存储引擎有的存储表结构的文件, frm

MyISAM

引擎的特点

  1. 不支持事务
  1. 表级锁定,锁定机制是表级别的锁定,使用共享锁
  1. 读写相互阻塞,在写的时候回阻塞读,在读的时候也会阻塞写入,读不会阻塞读
  1. 只会缓存索引,可以通过key_buffer_size缓存索引
  1. 读取速度快,占用资源少
  1. 不支持外键约束,但支持全文索引

MyISAM适合的业务场景

  1. 不需要事务支持的业务
  1. 一般读数据比较多的应用
  1. 并发访问低的应用
  1. 数据修改相对较少的业务

CSV存储引擎

概念

CSV存储引擎可以将csv格式文件作为Mysql表进行处理,存储格式就是普通的csv文件,数据是以文本的形式存储在文件中,csv存储引擎会有两个文件,一个是.csv文件,存储表内容,.csm文件存储表元数据例如表的状态和数据量,还有系统文件.frm,存储表的结构

特点

  • 以CSV格式进行数据存储
  • 所有列不能为空
  • 不支持索引
  • 可对数据文件直接编辑

适用场景

适合做为数据交换的中间表(能够在服务器运行的时候,拷贝和拷出文件,可以将电子表格存储为CSV文件再拷贝到MySQL数据目录下,就能够在数据库中打开和使用。同样,如果将数据写入到CSV文件数据表中,其它web程序也可以迅速读取到数据。

Archive存储引擎

概念

适用于存储大量数据,支持查询和插入操作,不支持修改和删除,同时只允许在自增ID列加索引

适用场景

相对于其他存储引擎,Archive存储引擎所用空间最小,可以适用于日志和数据采集,历史数据保存等场景

Memory存储引擎

特点

  • Memory存储引擎是适用存储在内存的内容创建表,所有数据放在内存中
  • 默认使用的是哈希索引
  • 当数据库关闭重启,其数据都会消失,只保留表结构
  • Memory类型表的大小是受到限制的,

max_heap_table_size的大小默认为16MB,可以按需要进行扩大。

适用场景

可以作为统计的中间表,便于高效的对中间结果进行分析

FEDERATED引擎

概念

该引擎可以访问远程数据库的表中的数据

InnoDB引擎

概念

对于一个使用InnoDB的表它是由frm文件和一个表空间文件(ibd)组成,frm文件负责存储表结构,表空间文件负责存储数据和索引,InnoDB是支持事务的,是MYSQL5.5版本之后的默认存储引擎

体系结构

InnoDB存储引擎是由内存池、后台线程、磁盘存储三大部分组成。

image-20211026224509763

线程

InnoDB使用的是多线程模型,其后台有多个不同的线程负责处理不同的任务

  • Master Thread

主线程是最核心的线程,负责将缓冲池中数据异步刷新到磁盘,保证数据一致性。包括脏页刷新、合并插入缓冲、UNDO页的回收

  • IO Thread

InnoDB存储引擎大量使用异步IO来处理IO请求,IO Thread 的工作主要是负责这些IO请求回调。

  • Purge Thread

事务提交后,其所使用的undo log可能不再需要,因此需要Purge Thread来回收undo页。

  • Page Cleaner ThreadPage

Cleaner Thread的作用是取代Master Thread中脏页刷新的操作,其目的是减轻原Master Thread的工作及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能。

内存

image-20211026224525824

  • 缓冲池

InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。但是由于CPU速度和磁盘速度之间的鸿沟,基于磁盘的数据库系统通常使用缓冲池记录来提高数据库的的整体性能。

缓冲池其实就是通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。在数据库进行读取操作时,首先将磁盘中的页放入缓冲池中,下次再读取相同页时,首先从缓冲池中获取该页数据,起到高速缓存的作用。

数据修改操作,首先修改在缓冲池中的页数据,然后会使用一种Checkpoint的机制刷新到磁盘上。

缓冲池可以通过这个参数innodb_buffer_pool_size来设置。

缓冲池可以缓存的类型:索引页,undo页,锁信息,数据页等信息

  • 日志

innodb_log_buffer_size

负责redo日志的缓冲

宏观结构

image-20211026224542242

frm:数据字典信息(列的定义和属性)

ibd:(独立表空间):数据行和索引

ibdata1(共享表空间文件):数据字典信息,UNDO(事务回滚日志),double waite 磁盘区域,change buffer磁盘区域

ib_logfile0~ib_logfileN:InnoDB 事务重做日志(redo log)

ibtmpl:临时表空间文件(排序,分组,多表连接,子查询,逻辑备份等)

ib_buffer_pool:正常关库的时候,存储缓冲区的热数据

表空间

什么是表空间呢?

起初,表空间是为了解决存储空间扩展的问题,因为存储引擎存储数据是存储在磁盘中,如果磁盘满了,需要加更大的磁盘,这时可以通过表空间来横向扩展,多个磁盘都是与表空间连接来实现扩展。

MySQL5.5版本引入了共享表空间模式,5.6版本开始就改为默认是独立表空间模式。

表空间类型

共享表空间:存储系统数据,日志,undo日志,临时表,用户数据和索引。

独立表空间:单表空间,存储数据和索引

undo表空间:存储undo logs(回滚日志)

临时表空间: 存储临时表

表空间 段 区 页

image-20211026224601529

  • 段就是上图的segment区域,常见的段有数据段、索引段、回滚段等,在InnoDB存储引擎中,对段的管理都是由引擎自身所完成的。
  • 区就是上图的extent区域,区是由连续的页组成的空间,无论页的大小怎么变,区的大小默认总是为1MB。为了保证区中的页的连续性,InnoDB存储引擎一次从磁盘申请4-5个区,InnoDB页的大小默认为16kb,即一个区一共有64(1MB/16kb=16)个连续的页。每个段开始,先用32页(page)大小的碎片页来存放数据,在使用完这些页之后才是64个连续页的申请。这样做的目的是,对于一些小表或者是undo类的段,可以开始申请较小的空间,节约磁盘开销。
  • 页就是上图的page区域,也可以叫块。页是InnoDB磁盘管理的最小单位。默认大小为16KB,可以通过参数innodb_page_size来设置。常见的页类型有:数据页,undo页,系统页,事务数据页,插入缓冲位图页,插入缓冲空闲列表页,未压缩的二进制大对象页,压缩的二进制大对象页等。

redo log 和undo log

redo log 重做日志

用来存储,MySQL再做修改类操作时的数据页变化过程,属于物理日志。

事务的隔离性是由锁实现的,事务的一致性、持久性是由数据库redo log来实现

redo log记录事务的行为,可对页进行重做处理

当事务提交时,需要将该事务所有日志写入到redo log 进行持久化

undo log 回滚日志

用来存储回滚日志,可以理解为记录了每次操作的反操作

事务的原子性是由undo log实现的

undo是逻辑日志,根据每行记录进行记录。

回滚操作使用undo,undo是逻辑日志,可将数据库逻辑恢复到原来样子

系统表空间和独立表空间比较

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

InnoDB特性

  • InnoDB是支持事务的
  • Innob支持行级锁