InnoDB存储引擎—存储逻辑结构
在InnoDB存储引擎中,每张表都有个主键,如果在创建时没有显示定义主键(primary Key),则InnoDB存储会按如下方式选择或创建主键
1. 首先表中是否有非空的唯一索引(unique not null),如果有,则该列即为主键.
2. 不符合上述条件,InnoDB存储引擎自动创建一个6个字节大小的指针
一. InnoDB逻辑存储结构
InnoDB存储引擎的逻辑存储结构和Oracle大致相同,所有数据都被逻辑地存放在一个空间中,我们称之为表空间(tablespace).表空间又由段(segment)、区(extent)、页(page)组成.
所有的数据都是存放在表空间中,如果我们启用了innodb_file_per_table,则每张表内的数据可以单独放到一个表空间中.
对于启用了innodb_file_per_table的参数选项,每张表的表空间内存放的只是数据、索引和插入缓冲,如撤消(Undo)信息、系统事务信息、二次写缓冲(double write buffer)等还是放在原来共享表空间内.
1. 段
表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等.因为前面已经介绍过了InnoDB存储引擎表的索引组织(index organized),因此数据即索引,索引即数据。InnoDB存储引擎对于段的管理是由引擎本身完成的。
2. 区
区是由64个连续的页组成的,每个页大小为16K,即每个区大小为1MB.对于大的数据段,InnoDB存储引擎最多每次可以申请4个区,以此来保证数据的顺序性能.
3. 页
同大多数数据库一样,InnoDB有页概念.页是InnoDB磁盘管理的最小单位.
常见的页类型有:
1. 数据页
2. UnDO页
3. 系统页
4. 事务数据页
5. 插入缓冲位图页
6. 插入组冲空闲列表页
7. 二进制大对象页
4. 行
InnoDB存储引擎是面向行(row-oriented),也就是说数据的存放按行进行存放的.每个页存放的行记录也是有硬性定义的,最多允许存放16K/2-200行的记录.
InnoDB表由共享表空间、日志文件组、表结构定义组成.若将innodb_file_per_table设置为on,
则每个表将独立地产生一个表空间文件,以idb结构,数据、索引、表的内部数据字典信息都将保存在这个单独的表空间文件中.
表结构定义文件以.frm结尾,这个是与存储引擎无关的.任何存储引擎的表结构定义文件都一样,为.frm文件.
innoDB行记录格式
innoDB行记录是以行的形式存储的,这意味着页中保存着表中一行行的数据.到MySQL5.1时,innoDB存储引擎提供了Compact和Redundant两种格式来存放行记录数据,Redundant是为兼容之前版本而保留的.
可以通过show table status like ‘table_name’查看当前表使用的行格式,其
中row_format就代表了当前使用的行记录结构类型.
1. Compact行记录格式
Compact行记录是在MySQL5.1时被引入的,其设计目标是能为高效存放数据.简单来说,就是一个页存放的行数据越多,其性能就越高
.compact按照以下格式进行存放
变长字段长度列表 Null标志位 记录头信息 列1数据….列n数据
变长字段长度列表:compact行格式的首部是一个非NULL变长字段长度列表,而是按照列的顺序逆序放置的:
当列的长度小于255字节,用1字节表示
当大于255字节,用2字节表示
变长字段的长度最大不可能超过2个字节(MySQL中varchar的最大长度为65535,因为2个字节为16位.)
NULL标志位:该位指示了该行数据中是否有NULL值,用1表示。该部分所占字节应该为bytes.
记录头信息:固定占用5个字节(40位).
最后就是实际数据存放的地方了.
注:每行数据除了用户定义的列外,还有两个隐藏列,事务ID和回滚指针列,分别为6个字节和7个字节大小.
若innoDB表没有定义Promary Key每行还会增加一个6字节的RowID列.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26690043/viewspace-720649/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26690043/viewspace-720649/