InnoDB存储结构二

InnoDB线程模型

在这里插入图片描述

IO Thread

在InnoDB中使用了大量的AIO(Async IO)来做读写处理,这样可以极大提高数据库的性能。在
InnoDB1.0版本之前共有4个IO Thread,分别是write,read,insert buffer和log thread,后来
版本将read thread和write thread分别增大到了4个,一共有10个了。

  • read thread : 负责读取操作,将数据从磁盘加载到缓存page页。4个
  • write thread:负责写操作,将缓存脏页刷新到磁盘。4个
  • log thread:负责将日志缓冲区内容刷新到磁盘。1个
  • insert buffer thread :负责将写缓冲内容刷新到磁盘。1个
show engine  innodb status \G;

在这里插入图片描述

Purge Thread

事务提交之后,其使用的undo日志将不再需要,因此需要Purge Thread回收已经分配的undo
页。
show variables like ‘%innodb_purge_threads%’;
在这里插入图片描述
4个线程来做,大于0表示启用,0表示禁用

Page Cleaner Thread

作用是将脏数据刷新到磁盘,脏数据刷盘后相应的redo log也就可以覆盖,即可以同步数据,又能
达到redo log循环使用的目的。会调用write thread线程处理。
show variables like ‘%innodb_page_cleaners%’;

在这里插入图片描述
调用了ioThread中的writeThread,来完成

Master Thread

Master thread是InnoDB的主线程,负责调度其他各线程,优先级最高。作用是将缓冲池中的数
据异步刷新到磁盘 ,保证数据的一致性。包含:脏页的刷新(page cleaner thread)、undo页
回收(purge thread)、redo日志刷新(log thread)、合并写缓冲等。内部有两个主处理,分别
是每隔1秒和10秒处理

  • 每1秒的操作:
    刷新日志缓冲区,刷到磁盘
    合并写缓冲区数据,根据IO读写压力来决定是否操作
    刷新脏页数据到磁盘,根据脏页比例达到75%才操作(innodb_max_dirty_pages_pct,innodb_io_capacity)

在这里插入图片描述
在这里插入图片描述

  • 每10秒的操作:
    刷新脏页数据到磁盘
    合并写缓冲区数据
    刷新日志缓冲区
    删除无用的undo页-一次删除300
    在这里插入图片描述

InnoDB数据文件

InnoDB文件存储结构

在这里插入图片描述
InnoDB数据文件存储结构:
分为一个ibd数据文件–>Segment(段)–>Extent(区)–>Page(页)–>Row(行)

  • Tablesapce
    表空间,用于存储多个ibd数据文件,用于存储表的记录和索引。一个文件包含多个段。

  • Segment
    段,用于管理多个Extent,分为数据段(Leaf node segment)、索引段(Non-leaf node
    segment)、回滚段(Rollback segment)。一个表至少会有两个segment,一个管理数
    据,一个管理索引。每多创建一个索引,会多两个segment。

  • Extent
    区,一个区固定包含64个连续的页,大小为1M。当表空间不足,需要分配新的页资源,不会
    一页一页分,直接分配一个区。

  • Page
    页,用于存储多个Row行记录,大小为16K。包含很多种页类型,比如数据页,undo页,系
    统页,事务数据页,大的BLOB对象页。

  • Row
    行,包含了记录的字段值,事务ID(Trx id)、滚动指针(Roll pointer)、字段指针(Field
    pointers)等信息

    Page是文件最基本的单位,无论何种类型的page,都是由page header,page trailer和page
    body组成。如下图所示
    在这里插入图片描述

InnoDB文件存储格式

在这里插入图片描述
一般情况下,如果row_format为REDUNDANT、COMPACT,文件格式为Antelope;如果
row_format为DYNAMIC和COMPRESSED,文件格式为Barracuda

通过 information_schema 查看指定表的文件格式

select * from information_schema.innodb_sys_tables;

在创建表和索引时,文件格式都被用于每个InnoDB表数据文件(其名称与*.ibd匹配)。修改文件
格式的方法是重新创建表及其索引,最简单方法是对要修改的每个表使用以下命令:

ALTER TABLE 表名 ROW_FORMAT=格式类型;
File文件格式(File-Format)

在早期的InnoDB版本中,文件格式只有一种,随着InnoDB引擎的发展,出现了新文件格式,用于
支持新的功能。目前InnoDB只支持两种文件格式:Antelope 和 Barracuda。

  • Antelope: 先前未命名的,最原始的InnoDB文件格式,它支持两种行格式:COMPACT和
    REDUNDANT,MySQL 5.6及其以前版本默认格式为Antelope。

  • Barracuda: 新的文件格式。它支持InnoDB的所有行格式,包括新的行格式:COMPRESSED
    和 DYNAMIC。

通过innodb_file_format 配置参数可以设置InnoDB文件格式,之前默认值为Antelope,5.7版本
开始改为Barracuda。

ROW格式(Row_format)

表的行格式决定了它的行是如何物理存储的,这反过来又会影响查询和DML操作的性能。如果在
单个page页中容纳更多行,查询和索引查找可以更快地工作,缓冲池中所需的内存更少,写入更
新时所需的I/O更少。
InnoDB存储引擎支持四种行格式:REDUNDANT、COMPACT、DYNAMIC和COMPRESSED。
在这里插入图片描述
DYNAMIC和COMPRESSED新格式引入的功能有:数据压缩、增强型长列数据的页外存储和大索引前缀。每个表的数据分成若干页来存储,每个页中采用B树结构存储;

如果某些字段信息过长,无法存储在B树节点中,这时候会被单独分配空间,此时被称为溢出页,
该字段被称为页外列

  • REDUNDANT 行格式
    使用REDUNDANT行格式,表会将变长列值的前768字节存储在B树节点的索引记录中,其余的存储在溢出页上。对于大于等于786字节的固定长度字段InnoDB会转换为变长字段,以便能够在页外存储

  • COMPACT 行格式
    与REDUNDANT行格式相比,COMPACT行格式减少了约20%的行存储空间,但代价是增加了某些操作的CPU使用量。如果系统负载是受缓存命中率和磁盘速度限制,那么COMPACT格式可能更快。如果系统负载受到CPU速度的限制,那么COMPACT格式可能会慢一些。

  • DYNAMIC 行格式
    使用DYNAMIC行格式,InnoDB会将表中长可变长度的列值完全存储在页外,而索引记录只包含指向溢出页的20字节指针。大于或等于768字节的固定长度字段编码为可变长度字段。DYNAMIC行格式支持大索引前缀,最多可以为3072字节,可通过innodb_large_prefix参数控制。

  • COMPRESSED 行格式
    COMPRESSED行格式提供与DYNAMIC行格式相同的存储特性和功能,但增加了对表和索引数据压缩的支持。

 select * fro information_schema.innodb_sys_tables;

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值