InnoDB 逻辑存储单元主要分为 表空间(tablespace)、段(segment)、区(extent) 和 页(page)。

层级关系为:tablespace –> segment –> extent(64个page,1MB) –> page

(1)表空间 tablespace

InnoDB 存储引擎表中所有数据都是存储在表空间中的。

表空间又分为 系统(共享)表空间 和 独立表空间。

  • 系统表空间:它以ibdata1 来命名,在安装数据库初始化数据时就是系统在创建一个 ibdatal 的表空间文件,它会存储所有数据的信息以及回滚段 (undo)的信息

    MySQL5.6 之后,undo 表空间可以通过参数单独设置存储位置了,可从 ibdatal 中独立出来。

    Innodb_data_file_path 负责定义系统表空间的路径、初始化大小、自动扩展策略。数据库默认的自动扩展大小是 64MB。

show variables like '%auto%';

5.6.7之前数据库默认的 ibdata1 的大小是 10MB(5.6.7之后默认是12MB),这里建议不要使用 10MB 的默认大小,在遇到高并发事务时,会受到不小的影响。建议把 ibdata1 的初始数值大小调整为 1GB。

# mysql5.7版本下测试
show variables like '%innodb_data%';

  • 独立表空间:设置参数innodb_file_per_table=1即可。
    目前MySQL版本中,默认使用的都是独立表空间(即每个表都有自己的表空间文件,不用存储在ibdata1中)。

    独立表空间文件 存储对应表的 B+树数据、索引 和 插入缓冲等信息,其余信息还是存储在默认表空间中,如下图所示。

共享表空间 和 独立表空间的区别?

暂略…

5.7之后又有 临时表空间 和 通用表空间。

InnoDB数据字典

lnnoDB存储引擎特意定义了一些列的 内部系统表 (internalsystem table)来记录表的元数据。

它们都是以 B+ 树的形式保存在系统表空间的某些页面中,其中 SYS_TABLES 、 SYS_COLUMNS 、SYS_INDEXES 、 SYS_FIELDS 这四个表尤其重要,称之为基本系统表 (basic system tables)。

SHOW TABLES LIKE '%INNODB_SYS%';

在MySQL中,SCHEMA是数据库,因此SCHEMATA表提供有关数据库的信息。
SCHEMATA表有以下列:

CATALOG_NAME :SCHEMA所属目录的名称。该值始终为def。
SCHEMA_NAME :SCHEMA名称
DEFAULT_CHARACTER_SET_NAME:SCHEMA默认字符集
DEFAULT_COLLATION_NAME :SCHEMA字符集排序规则
SQL_PATH :此值始终为NULL

(2)段 segment

表空间 由段组成,可以把一个表理解为一个段。

通常有数据段、回滚段、索引段等。

每个段由N个区和32个零散的页组成,段空间扩展是以区为单位进行扩展的。

通常情况下,创建一个索引的同时就会创建 2 个段,分别为 非叶子节点(索引段) 和 叶子节点段(数据段)。

一个表至少会有两个段,一个管理数据,一个管理索引。每创建一个索引就会多两个段。

一个段包含256个区(256M大小)

(3)区 extent

区 是 由连续的页组成,是物理上连续分配的一段空间,每个区的大小固定是1MB。

一个区包含64个连续的页,默认大小为 1MB (64*16K)。

当表空间不足需要分配新的页资源不会一页一页分,直接分配一个区。

(4)页 page

InnoDB 的最小物理存储分配单位是 页(page)。

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

MySQL 5.6 开始可以自定义调低page的大小,可以从默认的 16KB 调整为 8KB 或 4KB。

MySQL 5.7 开始可以调高page的大小,可以从默认的 16KB 调整为 32KB 或 64KB。

一般情况下,一个page页会默认预留 1/16 的空间用于更新数据,真正使用的是 15/16 的空间。

一个页最少可以存两行数据,虚拟最小行(infimum records)和 虚拟最大行(supremum records),用来限定行记录的范围,以此来保证 B+树节点是双向链表结构。如下图:

Page是文件最基本的单元,无论何种类型的page,都是由page header, page trailer 和 page body 组成。如下图示:

(5)行 row

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

InnoDB 存储引擎是面向列的,即数据时按照行存储的。

InnoDB 存储引擎有两种文件格式: AntelopeBarracuda

  • Antelope文件格式中,有 compactredundant 两种行记录格式。

  • Barracuda文件格式下,有 compresseddynamic 两种行记录格式。

通过show table status 命令可以看到文件的存储格式,如下图,row_format 就表示行格式存储类型。

查看 文件格式

SHOW VARIABLES LIKE '%innodb_file%';

查看行记录格式

SHOW VARIABLES LIKE '%row_format%';

行记录格式可以分为四种:Compactdynamicredundantcompressed

目前最多使用的就是 Compact 行记录格式,新版本 MySQL 5.7 默认使用 dynamic 行记录格式和 Barracuda 文件格式。

具体详解 暂略。。。。

https://www.cnblogs.com/ilovebath/p/15893501.html
https://blog.csdn.net/jqsfjqsf/article/details/124641547
http://img.zbpblog.com/blog-386.html

总结:
表空间表示一本书,段表示书中的章节,区表示每章节的小节,页表示书的每一页,行就是每页的每行数据。表空间里有多个段,一个段包含256个区,一个区包含64个页,一个页为16K。

作者:admin  创建时间:2023-02-01 14:47
最后编辑:admin  更新时间:2023-02-01 17:26