MySQL--表
索引组织表
在 InnoDB 存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表。在 InnoDB 存储引擎表中,每张表都有个主键,如果在创建表时没有显式地定义主键,则 InnoDB 存储引擎会按照如下方式选择或创建主键:
首先判断表中是否有非空的唯一索引,如果有,则该列即为主键。
如果不符合上述条件,InnoDB 存储引擎自动创建一个 6 字节大小的指针(_rowid)。
当表中有多个非空唯一索引时,InnoDB 存储引擎将选择建表时第一个定义的非空唯一索引为主键。这里需要注意的是,主键的选择根据的是定义索引的顺序,而不是建表时列的顺序。
InnoDB 逻辑存储结构
从 InnoDB 存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个表空间中,称之为表空间。表空间又由段、区、页组成。页在一些文档中有时也称为块。
表空间
表空间可以看做是InnoDB 存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。
如果启用了参数 innodb_file_per_table ,则每张表内的数据可以单独放到一个表空间内。
每张表的表空间内存放的只是数据、索引和插入缓冲 Bitmap 页,其他类的数据,如回滚信息,插入缓冲索引页、系统事务信息,二次写缓冲等还是存放在原来的共享表空间内。
段
常见的段有数据段、索引段、回滚段等。
区
区是由连续页组成的空间,在任何情况下每个区的大小都为 1 MB。为了保证区中页的连续性,InnoDB 存储引擎一次从磁盘申请 4~5 个区。在默认情况下,InnoDB 存储引擎页的大小为 16KB,即一个区中一共有 64 个连续的页。
InnoDB 1.2.x 版本新增了参数 innodb_page_size ,通过该参数可以将默认页的大小设为 4K,8K,但是页中的数据库不是压缩。
不论页的大小怎么变化,区的大小总是 1M。
页
页是 InnoDB 磁盘管理的最小单位。
在 InnoDB 存储引擎中,默认每个页的大小是 16KB。从 InnoDB 1.2.x 版本开始,可以通过参数 innodb_page_size 将页的大小设置为 4K、8K、16K。若设置完成,则所有表中页的大小都为设置的值,不可以对其再次进行修改。除非通过 mysqldump 导入和导出操作来产生新的库。
在 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 行记录格式
在 InnoDB 1.0.x 版本之前,InnoDB 存储引擎提供了 Compact 和 Redundant 两种格式来存放行记录数据,这也是目前使用最多的一种格式。Redundant 格式是为了兼容之前版本而保留的。在 MySQL 5.1 版本中,默认设置为 Compact 行格式。
show table status like 'table_name'; 查看当前表使用的行格式。
Compact 行记录格式:
Compact 行记录是在 MySQL 5.0 中引入的,其设计目标是高效地存储数据。简单来说,一个页中存放的行数据越多,其性能就越高。
Redundant 行记录格式:
Redundant 是 MySQL 5.0 版本之前 InnoDB 的行记录存储方式。
行溢出数据:
InnoDB 引擎可以将一条记录中的某些数据存储在真正的数据页面之外。
Compressed 和 Dynamic 行记录格式:
InnoDB 1.0.x 版本开始引入了新的文件格式,以前支持的 Compact 和 Redundant 格式称为 Antelope 文件格式,新的文件格式称为 Barracuda 格式。Barracuda 文件格式下拥有两种新的行记录格式:Compressed 和 Dynamic。新的两种记录格式对于存放的 BLOB 中的数据采用了完全的行溢出方式。
Compressed 行记录格式的另一个功能就是,存储在其中的行数据会以 zlib 的算法进行压缩,因此对于 BLOB、TEXT、VARCHAR 这类大长度类型的数据能够进行非常有效的存储。
CHAR 的行存储结构:
在不同的字符集下,CHAR 类型列内部存储的可能不是定长的数据。
InnoDB 存储引擎中,CHAR 类型被视为变长字符类型,对于未能沾满长度的字符还是填充 0x20。
InnoDB 数据页结构
InnoDB 数据页由以下 7 个部分组成:
File Header(文件头)
Page Header(页头)
Infimun 和 Supermum Records
User Records(用户记录,即行记录)
Free Space(空闲记录)
Page Directory(页目录)
File Trailer(文件结尾信息)
Named File Format 机制
从 InnoDB 1.0.x 版本开始,InnoDB 存储引擎通过 Named File Format 机制来解决不同版本下页结构兼容性的问题。
innodb_file_format 用来指定文件格式。