表是关于特定实体的数据集合,这也是关系型数据库模型的核心。
1索引组织表
在InnoDB存储引擎中,每张表都有一个主键(Primary Key),如果创建表时没有显示定义主键,则会按照如下方式创建主键:
- 存在非空的唯一索引(Unique NOT NULL),则该列为主键。
- 存在多个非空唯一索引时,会自动选择建表时第一个定义的非空唯一索引为主键。
- 如不符合上述条件,会自动创建一个6字节大小的指针。
2. InnoDB存储结构
从InnoDB存储引擎的逻辑结构看,所有数据都被逻辑存放在一个空间中,称为表空间。表空间又由段(segment)、区(extent)、页(page)组成。逻辑存储结构如下图:
图2-1 InnoDB逻辑存储结构
2.1表空间
每张表的表空间内存放的只是数据、索引和插入缓冲bitmap页,而回滚(undo)信息、插入缓冲索引页、系统事务信息、二次写缓冲(Double write buffer)存放在共享表空间中。
2.2段
数据段是B+树的叶子节点,而索引段为B+树的非索引节点。
2.3区
区是连续页组成的空间,在任何情况下每个区的大小都是1MB,如果默认页的大小是16KB,即一个区中一共有64个连续的页。
2.4页
页是InnoDB磁盘管理的最小单位,默认为16KB,从1.2.x版本开始,可以通过参数innodb_page_size将页的大小设置成4K、8K或16K。
2.5行
每个行存放记录是有硬性规定的,最多可放16KB / 2~200行的记录,即7992行条记录。
3 InnoDB行记录格式
图3-1 行结构图
1.Antelope: 先前未命名的,原始的InnoDB文件格式。它支持两种行格式:Compact 和 Redundant。MySQL5.6的默认文件格式。可以与早期的版本保持最大的兼容性。不支持 Barracuda 文件格式。
2.Barracuda: 新的文件格式。它支持InnoDB的所有行格式,包括新的行格式:COMPRESSED 和 DYNAMIC(MySQL 5.7默认)。与这两个新的行格式相关的功能包括:InnoDB表的压缩,长列数据的页外存储和索引建前缀最大长度为3072字节。
注:如果要修改现有表的行模式为compressed或dynamic,必须先将文件格式设置成Barracuda:set global innodb_file_format=Barracuda;,再用ALTER TABLE tablename ROW_FORMAT=COMPRESSED;去修改才能生效。
查看文件格式方式如下:
mysql> show variables like "innodb_file_format";
+--------------------+-----------+
| Variable_name | Value |
+--------------------+-----------+
| innodb_file_format | Barracuda |
+--------------------+-----------+
1 row in set (0.00 sec)
3.1 compact格式
表3-1 Compact行记录格式
变长字段长度列表 |
NULL标志位 |
记录头信息 |
列1数据 |
列2数据 |
列3数据 |
- 变长字段长度列表:倒叙存放非NULL变长字段的位置。
- NULL标志位:1或2个字节存放是否有NULL值。
- 记录头信息:固定5个字节,最后两个字节存放下一个行数据的偏移地址。
3.2 Dynamic格式
与Compact行格式很像,差异在于页面溢出的处理上;
Dynamic行记录格式存放在BLOB中的数据采用完全行溢出的方式,在数据页只存放29个字节的指针,实际的数据都会存放在Off Page中。如下图所示:
图3-2 Barracuda文件格式的溢出行
4 InnoDB数据页结构
图4-1 InnoDB存储引擎数据页结构