Featured image of post Java工程师 InnoDB存储引擎详解

Java工程师 InnoDB存储引擎详解

🌏Java工程师 InnoDB存储引擎详解 🎯 这篇文章用于记录InnoDB存储引擎详解的学习

逻辑存储结构分析

  • 表空间(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架构图,左侧为内存结构,右侧为磁盘结构。

缓存池

ChangeBuffer

自适应哈希索引

日志缓冲区