博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

InnoDB:表

Posted on 2017-09-14 17:46  开飞机的贝塔  阅读(127)  评论(0编辑  收藏  举报

数据在表中是如何进行组织存放的?下面我们就来看看:

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)