数据在表中是如何进行组织存放的?下面我们就来看看:
InnoDB引擎表的类型
InnoDB表都会有一个主键。
如果没有显示的指定主键,首先会去查找,看是否有非空的唯一索引,
如果有,则该列为主键;如果没有,那么引擎会自动创建一个6字节大小的指针。
InnoDB逻辑存储结构
所有的数据都被逻辑的放在一个空间中,称之为表空间。
表空间由段、区、页组成,页也叫做块。
表空间
对于启用了innodb_file_per_table的数据库,需要注意的是,数据、索引和插入缓冲是放在每张表的单独表空间中的,
其余像撤销信息、系统事务信息、二次写缓冲等还是放在共享表空间中。所以,共享表空间会不停地增涨。
段
表空间由数据段、索引段和回滚段组成。
段的管理是由引擎来管理的。
区
区是由64个连续的页组成,每个页大小16K,则每个区大小为1M。
InnoDB引擎每次最多可以申请4个区。
但是,启用了innodb_file_per_table参数之后,默认创建的表大小为96KB。这是为什么呢?
在每个段开始时,有32个页大小的碎片页来存放数据,之后才去申请64个连续的页。
页
页是磁盘管理的最小单位。
常见的页类型有:
数据页(B-tree Node)
Unod页(Undo Log Page)
系统页(System Page)
事务数据页(Transaction System Page)
插入缓冲位图页(Insert Buffer Bitmap)
插入缓冲空闲列表页(Insert Buffer Free List)
未压缩的二进制大对象页(Uncompressed BLOB Page)
压缩的二进制大对象页(Compressed BLOB Page)
行
InnoDB引擎数据按行进行存放,每个页中,最多允许7992行记录。
InnoDB物理存储机构
从物理意义上看,InnoDB表由共享表空间、日志文件组、表结构定义文件组成。
表空间文件以后缀.ibd结尾,表结构定义文件以后缀.frm结尾,任何存储引擎表结构定义文件都是以.frm结尾。
InnoDB行记录格式
现在的mysql版本默认的行格式为compact。
mysql> show table status like 'sala%'G;
*************************** 1. row ***************************
Name: salaries
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 2838426
Avg_row_length: 35
Data_length: 100270080
Max_data_length: 0
Index_length: 0
Data_free: 4194304
Auto_increment: NULL
Create_time: 2017-09-13 11:33:14
Update_time: NULL
Check_time: NULL
Collation: latin1_swedish_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)