InnoDB存储引擎—存储逻辑结构

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存储引擎提供了CompactRedundant两种格式来存放行记录数据,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个字节(MySQLvarchar的最大长度为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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值