如果创建表时没有显示的定义主键,mysql会按如下方式创建主键:
当表中有多个非空的唯一索引,会选择建表时第一个定义的非空唯一索引。注意根据的是定义索引的顺序,不是创建列的顺序。
所有数据都放在表空间中。如果开启了innodb_file_per_table
选项,则InnoDB会为每张表开辟一个表空间。但是需要注意的是表空间存放的只是数据、索引和插入缓冲bitmap页,其他数据比如undo信息,插入缓冲索引页,系统事务信息,二次写缓冲还是会放在原来的共享表空间内。
如果rollback后,共享表空间不会自动收缩,但是会判断空间是否需要(比如undo空间),如果不需要的话,会将这些空间标记为可用空间,供下次undo使用。
表空间由各个段组成,比如数据段,索引段,回滚段等。
区由连续的页组成,在任何情况下区的大小都是1M。InnoDB存储引擎一次从磁盘申请大概4-5个区。在默认情况下,页的大小为16KB,即一个区中有大概64个连续的页。
InnoDB磁盘管理的最小单位。
关于页的详细结构,参考:MySQL的InnoDB索引原理详解
数据是按行进行存放的。
InnoDB 1.0.x之前:
InnoDB 1.0.x之后
查看行格式的方法,注意row_format字段。
mysql> show table status like 'z'\G; ************************* Name: z Engine: InnoDB Version: 10 Row_format: Dynamic Rows: 2 Avg_row_length: 8192 Data_length: 16384 Max_data_length: 0 Index_length: 0 Data_free: 0 Auto_increment: NULL Create_time: 2016-10- Update_time: 2016-10- Check_time: NULL Collation: latin1_s Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec)
这里不详述各个行格式的格式了,有兴趣的可以看参考资料中的第4章。
InnoDB存储引擎可以将数据存储到数据页之外。例如大对象列类型通常会被存放行溢出数据。
先在数据页面保存前768字节的数据,之后保存偏移量,指向行溢出页,也就是Uncompressed BLOB Page。
对于Compressed和Dynamic行格式,采用完全的行溢出方式:
数据页只存放20字节的指针,实际数据存放在off page中。
参考资料书籍:MySQL技术内幕-InnoDB存储引擎》
共 0 条评论