逻辑存储结构分析
- 表空间(ibd文件):一个mysql实例可以对应多个表空间,用于存储记录、索引等数据;
- 段(Segment):分为数据段(Leaf node segment)、索引段(Non-leaf node segment)、回滚段(Rollback segment),InnoDB是索引组织表,数据段就是B+树的叶子节点,索引段即为B+树的非叶子节点。段用来管理多个区(Extent)。
- 区(Extent):表空间的单元结构,每个区的大小为1M。默认情况下,InnoDB存储引擎页大小为16K,即一个区中一共有64个连续的页。
- 页(Page):是InnoDB存储引擎磁盘管理的最小单元,每个页的大小默认为16KB。为了保证页的连续性,InnoDB存储引擎每次从磁盘申请4-5个区;
- 行(Row):InnoDB存储引擎数据是按照行进行存放的
- Trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列;
- Roll_pointer:每次对某条记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。
MySQL数据存储位置(Linux)
在Linux中 MySQL的数据存储位置为:/var/lib/mysql
进入dd_openapi数据库查看表文件
interface_info.frm
文件
作用
- 表结构定义文件:该文件存储的是表的元数据(Metadata),即表的“蓝图”或“骨架”。
- 它描述了表的结构,但与存储引擎无关。这意味着无论是 InnoDB、MyISAM 还是其他引擎,每个表都会有一个对应的
.frm
文件。存储的内容
.frm
是一个二进制文件,其内部格式对用户不直接可读,但它包含以下信息:
- 表名
- 每个列的定义:
- 列名(如
id
,name
,url
)- 列的数据类型(如
INT
,VARCHAR(255)
,TEXT
)- 是否允许
NULL
- 默认值
- 索引信息(但主要是索引的定义,如索引名、包含的列,而不是索引的数据本身)
- 字符集和排序规则
- 外键约束(定义)
- 视图定义(如果该
.frm
文件属于一个视图)简单来说,
.frm
文件告诉 MySQL:interface_info
表长什么样,它有哪些列,每列是什么类型。
interface_info.ibd
文件
作用
- 独立表空间文件:该文件存储的是表的实际数据和索引。这是 InnoDB 存储引擎特有的文件。
- 它的存在意味着
interface_info
表使用了innodb_file_per_table
配置(在现代 MySQL 版本中默认开启)。这个配置让 InnoDB 为每个表单独创建.ibd
文件来存储其数据和索引,而不是全部存放在共享的系统表空间(ibdata1
)中。存储的内容
.ibd
文件是一个复杂的、高度结构化的数据文件,它包含:
- 表数据(行记录):你插入到
interface_info
表中的每一行数据都存储在这里。- 索引:表上的所有索引(包括主键索引
PRIMARY KEY
和二级索引SECONDARY INDEXes
)的数据都存储在这里。在 InnoDB 中,表数据本身就是按主键顺序组织在聚簇索引(Clustered Index)中的。- Undo 日志、缓冲信息:该文件内部还包含一些用于管理事务(如 MVCC)和缓存的数据结构。
简单来说,
.ibd
文件是interface_info
表的“血肉”,存放着所有真实的数据内容。
InnoDB架构
MySQL5.5版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发中使用非常广泛。下图是InnoDB架构图,左侧为内存结构,右侧为磁盘结构。