InnoDB引擎是MySQL5.5版本之后默认的存储引擎,所以我们重点来讲解一下InnoDB存储引擎,其他引擎在这里就不再详细的去介绍了。
InnoDB的逻辑存储结构如下图所示:
1). 表空间
表空间是InnoDB存储引擎逻辑结构的最高层, 如果用户启用了参数 innodb_file_per_table(在 8.0版本中默认开启) ,则每张表都会有一个表空间(xxx.ibd),一个mysql实例可以对应多个表空间,用于存储记录、索引等数据。
在Linux系统中我们所安装的MySQL的数据文件是存放在 /var/lib/mysql
,这个目录下存放的就是MySQL的一些数据文件。
2). 段
段,分为数据段(Leaf node segment)、索引段(Non-leaf node segment)、回滚段 (Rollback segment),InnoDB是索引组织表,数据段就是B+树的叶子节点, 索引段即为B+树的非叶子节点。段用来管理多个Extent(区)。
3). 区
区,表空间的单元结构,每个区的大小为1M。 默认情况下, InnoDB存储引擎页大小为16K, 即一 个区中一共有64个连续的页。
4). 页
页,是InnoDB 存储引擎磁盘管理的最小单元,每个页的大小默认为 16KB。为了保证页的连续性, InnoDB 存储引擎每次从磁盘申请 4-5 个区。一页中又包含多个行。
5). 行
行,InnoDB 存储引擎数据是按行进行存放的。包含了具体的一个一个的字段值,以及行中的事务id,还有回滚指针等等。
在行中,默认有两个隐藏字段:
- Trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列。 即最后操作事务的id。
- Roll_pointer:每次对某条引记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。