索引组织表
索引组织表:在InnoDB存储引擎中,表都是根据主键顺序组织存放的,每个表都是有主键
_rowid可以显示表的主键,只能够查看单个列为主键的情况,并且为非空唯一索引。
InnoDB逻辑存储结构
表空间(tablespace)–>端(segment)—>区(extent)—>页(page)—>块(block)
表空间
表空间是InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。所有的数据都存放在这个表空间中。如果弃用了参数innodb_file_per_table,则每张表内的数据可以单独存放在一个表空间中。
表空间只存放数据、索引和插入缓冲Bitmap页,其他的数据(如回滚信息,插入缓冲索引页,系统事务信息,二次写缓冲)还是存放在原来的共享表空间中。
段
常见的段有数据段、索引段、回滚段。数据段为B+树的叶子节点,而索引段为B+树的非索引节点
区
由连续页组成的空间,在任何情况下每个区的大小都是1MB,在默认情况下页的大小为16KB,即一个区中一共有64个连续的页。
可以通过参数innodb_page_size来设置默认页的大小
页
页是InnoDB磁盘管理的最小单位,默认每个页的大小为16KB。
行
InnoDB存储引擎是面向列的,数据都是按照行来进行存放的,最多允许存放16KB/2-200行的记录,也就是7992行
InnoDB行记录格式
使用show table status like 'table_name'来查看当前表使用的行格式。
Compact行记录格式
MySQL5.0引入的,其设计的目的是高效地存储数据。
一个页中存放的行数据越多,其性能就越高。
在compact格式下,NULL值都不占用任何存储空间,不管是CHAR类型或者是VARCHAR类型
Redundant行记录格式
MySQL5.0之前的。
行溢出数据
BLOB可以不将数据放在溢出页面中,而且即使是VARCHAR列数据类型,依然有可能被存放为行溢出数据。通过实际测试,VARCHAR的类型的最大长度为65532.VARCHAR类型最大支持65535字节。
MySQL官方手册中定义的65535长度是指所有的VARCHAR列的长度总和,如果列的长度总和超过了这个长度,依然无法创建。
InnoDB存储引擎的页为16KB,也就是16384字节,在一般情况下,InnoDB存储引擎的数据都是存放在页类型为B-tree node中。但是当发生行溢出时,数据存放在页类型为Uncompress BLOB页中。
一个页存放数据,如果为两条数据的话,那么每条的最大的阈值为8098.
Compressed和Dynamic行记录格式
InnoDB1.0.x引入新的文件格式,Compressed和Dynamic
新的两种记录格式对于存放在BLOB中的数据采用完全的行溢出的方式。同时,存储在其中的行数据会以zlib的算法进行压缩,
CHAR的行结构存储
对于多字节字符编码的CHAR数据类型的存储,InnoDB存储引擎在内部将其视为变长字符类型,在变长长度列表中会记录CHAR数据类型的长度
CHAR(2)保存的是2个字符,不管是GBK,还是UTF-8,还是latin,都是2个字符,而不是2个字节。所以存储的字节是变化的。
InnoDB数据页结构
包括7个部分:File Header(文件头)
Page Header(页头)
infimum和Supremum Records
User Records(用户记录,即行记录)
Free Space(空闲空间)
Page Directory(页目录)
File Trailer(文件结尾信息)
Named File Formats机制