MySQL5.5版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发使用非常广泛。
逻辑存储结构
表空间tablespace (ibd文件)
一个mysql实例可以对应多个表空间,用于存储记录、索引等记录
mysql的文件位置在 /var/lib/mysql
以ibd为后缀的表空间文件,表空间文件并不是唯一的,我们打开一个数据库,一般一个表会对应一个表空间文件。
段Seqment
分为数据段、索引段、回滚段
InnoDB是索引组织表,使用的是B+树,数据段是B+树的叶子节点,索引段就是B+树的非叶子节点,段用来管理多个Extent(区)。
B+树上叶子节点上有数据,非叶子节点上没有数据,只有索引。
区Extent
每个区的大小为1M,默认情况下,InnoDB存储引擎页为16K,即一个区1中一共有64个连续的页。
页Page
是InnoDB存储引擎管理的最小单元,每个页的大小默认为16KB。为了保证页的连续性,InnoDB存储引擎每次从磁盘申请4-5个区,记录和索引等数据都是在页中存储。
常见页的类型有:
- 数据页(B-tree Node)
- undo页(undo Log Page)
- 系统页 (System Page)
- 事物数据页 (Transaction System Page)
- 插入缓冲位图页(Insert Buffer Bitmap)
- 插入缓冲空闲列表页(Insert Buffer Free List)
- 未压缩的二进制大对象页(Uncompressed BLOB Page)
- 压缩的二进制大对象页 (compressed BLOB Page)
行row
InnoDB存储引擎是面向列(row-oriented)的,也就是说数据是按行来进行存放的(数据表中的一行)。每个页存放的行记录也是有硬性定义的,最多允许存放16KB /2-200行的记录,即7992行记录。
- Trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列
- Roll_pointer:每次对某条记录进行1改动时1,都会把旧的版本写入到undo日志中,然 后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。
参考文献: