innodb逻辑存储结构整理

简介: 从innodb存储引擎的逻辑存储来看,所有数据都被逻辑地存放在一个空间中,称之为表空间tablespace,表空间又由段segment、区extent、页page组成。

在默认情况下,innodb存储引擎有一个共享表空间ibdata1,所有数据都存放在这个表空间内。如果开启了innodb_file_per_table,则每张表内的数据可以单独放在一个表空间内。


表空间由各个段组成,常见的段有数据段、索引段、回滚段等。

数据段即B+树的叶子节点

索引段:B+树的非索引节点


对段的管理是由innodb引擎自身完成的,DBA没有必要进行控制。


是由连续页组成的空间,在任何情况下,每个区的大小都是1MB。为了保证区中页的连续性,innodb存储引擎一次从磁盘申请4~5个区。在默认情况下,innodb存储引擎页的大小为16KB,即一个区中一共有64个连续的页。


innodb磁盘管理的最小单位,默认每个页的大小为16KB,而从1.2.x版本开始,可以通过参数innodb_page_size将页的大小设置为4K、8K、16K。

在innodb存储引擎中,常见的页类型:

数据页 B-tree Node

undo页 undo log page

系统页 system page

事务数据页 transaction system page

插入缓冲位图页 insert buffer bitmap

插入缓冲空闲列表页 insert buffer free list

未压缩的二进制大对象页 uncompressed blob page

压缩的二进制大对象页 compressed blob page



innodb存储引擎的数据是按照行存储的,每个页存放的行记录也是有硬性定义的,最多允许存放(16KB/2)-200行的记录,即7992行记录。


innodb存储引擎提供了Compact和Redundant两种格式来存放行记录数据。Redundant格式是为了兼容之前版本而保留的。

在mysql5.1版本中,默认设置为Compact格式。

Compact格式存储的方式:

变长字段长度列表

NULL标志位

记录头信息

列数据


还有两个隐藏列:事务ID  transaction ID和回滚指针列 roll pointer

一般认为blob、lob这类大对象列类型的存储会把数据存放在数据页面之外。


行溢出数据

可以将一条记录中的某些数据存储在真正的数据页面之外,一般认为BLOB、LOB这类的大对象列类类型的存储会把数据存放在数据页面之外。即使是varchar依然有可能存放在数据页面之外。



innodb1.0.x版本开始引入了新的文件格式,以前支持Compact和Redundant格式称为Antelope格式,新的文件格式称为Barracuda文化格式。Barracuda文件格式有两种行记录格式:Compressed和Dynamic。


新的两种记录格式对于存放BLOB中的数据采用完全的行溢出的方式。

也即在数据页只存放对应的字节指针,实际的数据都存放在Off Page中,而之前的Compact和Redundant格式会存放768个前缀字节。


Compressed行记录格式的另一个功能就是存储在其中行的数据会以zlib的算法进行压缩。


innodb数据页结构

数据主要存在非叶子节点。

innodb数据页由以下7部分组成:

File Header 文件头

Page Header 页头

Infimun和Supreme Record

User Record 用户记录,行记录

Free Space 空闲空间

Page Directory 页目录

File Trailer 文件结尾信息


参考:《MySQL技术内幕InnoDB存储引擎》 第二版 姜承尧

目录
相关文章
|
3月前
|
存储 关系型数据库 MySQL
MySQL InnoDB数据存储结构
MySQL InnoDB数据存储结构
|
2月前
|
存储 算法 关系型数据库
【MySQL技术内幕】4.4-InnoDB数据页结构
【MySQL技术内幕】4.4-InnoDB数据页结构
56 1
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据库——InnoDB引擎-逻辑存储结构(表空间、段、区、页、行)
MySQL数据库——InnoDB引擎-逻辑存储结构(表空间、段、区、页、行)
52 7
|
2月前
|
缓存 关系型数据库 MySQL
MySQL数据库——InnoDB引擎-架构-内存结构(Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer)
MySQL数据库——InnoDB引擎-架构-内存结构(Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer)
81 3
|
2月前
|
存储 关系型数据库 MySQL
【MySQL技术内幕】4.2-InnoDB逻辑存储结构
【MySQL技术内幕】4.2-InnoDB逻辑存储结构
25 0
|
2月前
|
存储 关系型数据库 MySQL
第七章InnoDB数据存储结构
第七章InnoDB数据存储结构
15 0
|
3月前
|
存储 关系型数据库 MySQL
【MySQL系列笔记】InnoDB引擎-数据存储结构
InnoDB 存储引擎是MySQL的默认存储引擎,是事务安全的MySQL存储引擎。该存储引擎是第一个完整ACID事务的MySQL存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及使用内存和 CPU。因此很有必要学习下InnoDB存储引擎,它的很多架构设计思路都可以应用到我们的应用系统设计中。
339 4
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
9天前
|
SQL 存储 关系型数据库
"MySQL增列必锁表?揭秘InnoDB在线DDL,让你的数据库操作飞一般,性能无忧!"
【8月更文挑战第11天】在数据库领域,MySQL凭借其稳定高效的表现深受开发者喜爱。对于是否会在给数据表添加列时锁表的问题,MySQL的行为受版本、存储引擎等因素影响。从5.6版起,InnoDB支持在线DDL,可在改动表结构时保持表的可访问性,避免长时间锁表。而MyISAM等则需锁表完成操作。例如,在使用InnoDB的表上运行`ALTER TABLE users ADD COLUMN email VARCHAR(255);`时,通常不会完全锁表。虽然在线DDL提高了灵活性,但复杂操作或大表变更仍可能暂时影响性能。因此,进行结构变更前应评估其影响并择机执行。
32 6
|
20天前
|
存储 SQL 关系型数据库
(十三)MySQL引擎篇:半道出家的InnoDB为何能替换官方的MyISAM?
MySQL是一款支持拔插式引擎的数据库,在开发过程中你可以根据业务特性,从支持的诸多引擎中选择一款适合的,例如MyISAM、InnoDB、Merge、Memory(HEAP)、BDB(BerkeleyDB)、Example、Federated、Archive、CSV、Blackhole.....