一、索引组织表
在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表。每张表都有个主键,如果在创建表时没有显式地定义主键,则InnoDB会按如下方式选择或创建主键:
(1)首先判断表中是否有非空的唯一索引(Unique NOT NULL),如果有,则该列即为主键
(2)如果无,InnoDB会自动创建一个6字节大小的指针
注:主键的选择根据的是定义索引的顺序,而不是建表时刻的顺序
二、InnoDB逻辑存储结构
从逻辑角度,所有数据被存放在一个空间中,称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)组成。页有时也被称为块(block)。结构如下:
- 表空间:逻辑结构的最高层,所有的数据都放在表空间中
- 段:常见的段有数据段、索引段、回滚段等。数据段即为B+树的叶子节点(Leaf node segment),索引段即为非叶子节点(Non-leaf node segment)。回滚段后续介绍。对段的管理是由引擎自身完成的。
- 区:区是由连续的页组成的,大小为固定的1MB。为保证页的连续性,InnoDB一次从磁盘申请4-5个区,默认情况下页大小为16KB,即一个区中有64个连续的页。
- 页:页/块是InnoDB磁盘管理的最小单位。默认页大小为16KB,可通过innodb_page_size设置为4K,8K,16K.设置完成后不可再次修改。常见的页类型有:(1)数据页(B-tree Node)(2)undo页(undo Log Page)(3)系统页(System Page)(4)事务数据页(Transaction system Page)(5)插入缓冲位图页(Insert Buffer Bitmap)(6)插入缓冲空闲列表页(Insert Buffer Free List)(7)未压缩的二进制大对象页(Uncompressed BLOB Page)(8)压缩的二进制大对象页(compressed BLOB Page)
- 行:InnoDB是面向列的(row-oriented),即数据是按行进行存放的。每个页最多存放16KB/2-200 = 7992行记录
二、InnoDB行记录格式
InnoDB提供了Compact和Redundant两种格式来存放行记录数据。Redundant格式是为了兼容之前的版本而保留的。
2.1 Compact
MySQL5.0版本之后支持:
2.2 Redundant
2.3 行溢出数据
InnoDB可以将一条记录中的某些数据存储在真正的数据页面之外。
2.4 Compressed和Dynamic行记录格式
2.5 CHAR的行结构存储
三、InnoDB数据页结构
四、Named File Formats机制
五、约束
5.1 数据完整性
关系型数据库系统和文件系统的一个不同点是,关系数据库本身能保证存储数据的完整性,不需要应用程序的控制,而文件系统一般需要在程序端进行控制。数据完整性有以下三种形式:
- 实体完整性:保证表中有一个主键。用户可通过定义Primary Key 或 Unique Key约束来保证实体的完整性;还可以通过编写触发器
- 域完整性:保证每列的值满足特定的条件。途径有:(1)选择合适的数据类型(2)外键(Foreign Key)约束(3)编写触发器(4)DEFAULT约束
- 参照完整性:保证两张表之间的关系。InnoDB允许用户定义外键以强制参照完整性,也可通过编写触发器强制执行。
5.2 约束的查找与创建
约束的创建可以在(1)表建立时就进行约束定义;(2)利用ALTER TABLE命令创建约束。
5.3 约束和索引的区别
5.4 对错误数据的约束
5.5 ENUM和SET约束
5.6 触发器与约束
触发器的作用是在执行INSERT, DELETE, UPDATE命令之前或之后自动调用SQL命令或存储过程。
创建触发器的命令是CREATE TRIGGER,只有具备Super权限的MySQL数据库用户才可以执行,最多可为一张表建立6个触发器,即三个命令之前和之后。
5.7 外键约束
六、视图(view)
视图是一个命名的虚表,由一个SQL查询来定义,可以当作表使用。与permanent table不同的是,视图中的数据没有实际的物理存储。