InnoDB
MySQL存储引擎是基于表的,也就是说每张表可以选择不同的存储引擎。
InnoDB存储引擎的表是索引组织的,也就是数据即索引。
存储引擎文件
InnoDB引擎会包含RedoLog重做日志文件和TableSpace表空间文件。
表空间文件
默认表空间文件(共享表空间):一个10MB的ibdata1的文件,该文件能够自动增长。
共享表空间存放:撤销日志UndoLog、系统事务信息、双写缓冲
文件格式
- frm文件:存储表结构信息
- ibd文件:存储当前表的数据、索引、插入缓冲
参数配置
innodb_data_file_path: 指定默认表空间文件地址
innodb_file_per_table: 是否为每个表单独产生一个表空间
RedoLog文件
存储引擎默认重做日志文件:ib_logfile0和ib_logfile1。
重做日志:记录了InnoDB的事务日志,可以用于恢复日志(断电)
表数据的组织
主键问题
每张表必须要有主键,按照如下的三种方法选取主键
- 显式定义主键
- 选择非空唯一索引做主键
- 自动创建6字节大小的指针主键
表空间tablespace
表空间用于存放表的数据、索引和插入缓冲。
段segment
表空间由各个段组成,常见的有数据段、索引段、回滚段。
数据段是B+树的叶节点段,索引段是B+树的非叶节点段。
区extent
区是64个连续的页组成的。1个区大小:16KB*64 = 1MB。
页page
页是InnoDB磁盘管理的最小单位,大小为16KB。
常见的页类型:
- 数据页
- Undo页
- 系统页
- 事务数据页
- 插入缓冲位图页
- 插入缓冲空闲列表页
- 未压缩的二进制大对象页
- 压缩的二进制大对象页
行
InnoDB是面向行的,即数据时按行存放的(也有列数据库如Hbase)。
InnoDB物理存储结构
行记录格式
Compact格式
- 于MySQL5.0引入
行的格式如下:
变长字段长度列表(按列逆序),NULL标志位,记录头信息,列1数据,列2数据,...,事务id,回滚指针,RowID(如果没有主键)
Redundant格式
- MySQL5.0之前的版本,用于向前兼容
行格式如下:
字段长度偏移列表(按列逆序),记录头信息,列1数据,列2数据...
锁
事务
参考文献
【1】MySQL技术内幕 InnoDB存储引擎 姜承尧
【2】MySQL技术内幕 第五版 Paul DuBois