Innodb存储架构

Innodb整体存储架构

Innodb是一款兼顾性能及可靠性的存储引擎,主要分为内存存储结构和磁盘存储结构,二者分别扮演着提高性能和数据持久化的工作

内存结构中定义了缓冲池、变更缓冲区、日志缓冲区、自适应哈希 四个缓冲区,它们均是为提升查询效率服务的,

磁盘结构中定义了各种表空间,分别是系统表空间、独立表空间、通用表空间、临时表空间、撤销表空间、双写缓冲区,它们均是为了可靠性服务的

表空间文件(*.ibd)

MySQL所有的数据最终都需要刷新到磁盘上进行持久化保证数据安全,必须通过合理的数据结构对庞大的数据集进行组织管理,MySQL默认情况下为每一张表生成一份独立表空间,表空间内部定义了不同的结构进行分层管理数据,从大到小依次段segment,组group,区extent,页page,行line

其中数据存储和查询返回的最小单位是数据行line

而MySQL服务与磁盘IO的最小单位为页page,一页的大小为16kb,页的设计基于局部性原理,尽量的减少访问磁盘的次数,来提高效率

页结构:

页是一次申请的一段连续空间,每一个页由页头,页尾,页主体 构成,其中页主体还能细分为数据页头,首行末行、用户数据区,空闲区、页目录

页主体主要由数据行构成,是存放用户真实数据的区域

页头存放页的一些描述信息,用来组织页与页之间的关联,通过页头所携带的信息可以快速寻找到上下页

页尾主要符合数据校验,确保数据的完整性

页主体:

数据页头:

用来描述当前页主体的状态,例如用户数据行数,空闲区,页目录的位置,事务索引有关信息
首行末行:

页主体初始化时就有了首行和末行,它们分别代表用户数据区的开始和结束
空闲区: 页主体中还未被使用的区域,可以被新增的用户数据所覆盖
用户数据区: 区中的所有用户数据以行为单位组织,每一个数据行通过单项链表组织,数据行可以通过行中存储的下一行偏移量来访问下一行数据
页目录: Innodb会通过主键对数据进行排序处理便于二分查找,当数据量庞大时,页目录中为生成一个个槽slot结构,每一个槽管理一小段数据行集合,查询时先通过检索槽来缩小查找范围

区结构:

批量读取数据的场景难免遇到数据跨页的情况,一旦发生数据跨页,就需要进行磁盘IO,严重影响效率,但是好在跨页访问的数据页在大多数情况下临近的,因此MySQL定义了区的概念用来管理多张页,如果用户频繁的对某一个区中的页进行访问,索性就把整个区加载到内存中,之后访问区中的页就不需要访问磁盘了

组结构:

同样问题引入了组结构来管理区,解决数据访问跨区的问题

行结构:

真实的数据在表空间以数据⾏的形式存储,即每⼀条数据都对应着表中的⼀⾏
数据行结构如图所示

变长字段长度列表+null值列表+头信息属于数据行描述信息
主键值+tx_id+roll_ptr+列属于数据行数据信息

主键值是一定存在的,不论用户是否手动定义

如果表中定义了主键,则直接存储主键的值;

如果是复合主键会根据列定义的顺序依次排列在这⾥;

如果没有主键,会优先使⽤第⼀个不允许为NULL的 UNIQUE 唯⼀列作为主键;

如果既没有主键也没有唯⼀键,那么InnoDB会构建⼀个6字节的字段 DB_ROW_ID 作为⾏的唯⼀标识,存储在真实数据的头部

tx_id为页中数据行的id,是页中数据行的唯一标识符

roll_ptr保存数据行的上一个版本,用于事务回滚操作

头信息:

next_record 是下一行的地址偏移量,正是通过next_record行与行之间才能使用单链表级联

record_type

0表示普通数据行

1表示索引数据行

2表示首行

3表示尾行
heap_no

0表示首行

1表示尾行

插入的数据行heap_no从2开始自增
n_owned

用于记录槽中的行数

一个槽中只有最后一行数据需要写明n_owned的值
delete_mask

删除标记位,当删除数据行时先把当前位置标记为已删除,将上一行数据和下一行数据进行链接,做到逻辑上的删除操作,同时将需要删除的行next_record指向一个垃圾链表,在合适的时机服务端会对垃圾链表中的数据行进行统一的物理删除

相关推荐
小乌龟不会飞42 分钟前
Ubuntu 安装 etcd 与 etcd-cpp-apiv3
数据库·etcd
小马爱打代码5 小时前
微服务外联Feign调用:第三方API调用的负载均衡与容灾实战
微服务·架构·负载均衡
程序员岳焱8 小时前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
计算机毕设定制辅导-无忧学长8 小时前
西门子 PLC 与 Modbus 集成:S7-1500 RTU/TCP 配置指南(一)
服务器·数据库·tcp/ip
9527华安9 小时前
FPGA实现40G网卡NIC,基于PCIE4C+40G/50G Ethernet subsystem架构,提供工程源码和技术支持
fpga开发·架构·网卡·ethernet·nic·40g·pcie4c
程序员柳9 小时前
基于微信小程序的校园二手交易平台、微信小程序校园二手商城源代码+数据库+使用说明,layui+微信小程序+Spring Boot
数据库·微信小程序·layui
梦在深巷、9 小时前
MySQL/MariaDB数据库主从复制之基于二进制日志的方式
linux·数据库·mysql·mariadb
IT乌鸦坐飞机9 小时前
ansible部署数据库服务随机启动并创建用户和设置用户有完全权限
数据库·ansible·centos7
IT_10249 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle
Johny_Zhao10 小时前
Ubuntu系统安装部署Pandawiki智能知识库
linux·mysql·网络安全·信息安全·云计算·shell·yum源·系统运维·itsm·pandawiki