当前位置: 首页 > article >正文

MySQL中InnoDB逻辑存储结构

在MySQL中,InnoDB是最常用的存储引擎之一,它具有高度的事务支持、行级锁、ACID特性以及自动崩溃恢复等特性。InnoDB的逻辑存储结构可以分为多个层次,下面是详细的解析。

1. 表空间 (Tablespace)

InnoDB的物理存储结构以表空间为基础。表空间负责管理存储数据、索引、表、日志等内容。InnoDB可以使用系统表空间(ibdata 文件)或独立表空间(*.ibd 文件)来存储数据。

  • 系统表空间:默认情况下,InnoDB将所有数据库的表和索引都存储在一个共享的表空间文件(ibdata1)中。可以包含多个数据库的表。
  • 独立表空间:如果开启了 innodb_file_per_table 配置项,每个表的数据和索引会存储在独立的 .ibd 文件中。

2. 页 (Page)

在InnoDB的存储引擎中,数据是按页(page)存储的,最小的I/O操作单位是页。每个页的大小通常为16KB,可以通过配置项 innodb_page_size 设置。一个表的数据文件由多个这样的页组成。

页分为以下几种类型:

  • 数据页 (Data Page):存储实际的数据行。每个数据页通常存储多个记录(row),它们的存储格式由行的长度和字段决定。
  • 索引页 (Index Page):存储B+树索引结构。索引是通过B+树结构来实现的,B+树的每个节点也是一个页。
  • 系统页 (System Page):存储InnoDB的元数据,如表空间、段、文件和表的相关信息。

3. 簇 (Cluster)

InnoDB表数据是以簇(Cluster)的方式存储的。InnoDB中的簇是指数据和索引被存储在一起的方式。每个InnoDB表都有一个主索引(聚簇索引),这个主索引包含了数据表的所有数据行。通过主键索引可以定位到数据页。

如果表没有定义主键,InnoDB会选择一个唯一索引作为聚簇索引,如果没有任何唯一索引,则会为其生成一个隐藏的聚簇主键。

4. B+树结构 (B+ Tree)

InnoDB使用B+树作为索引的数据结构。B+树是一种平衡树,它将数据组织为一个有序的结构,并提供高效的查找、插入、更新和删除操作。

  • 叶子节点:存储实际的数据行(对于聚簇索引来说,叶子节点就是数据本身)。
  • 非叶子节点:仅存储索引值,用来指向下一级节点或叶子节点。

InnoDB的B+树索引通常有两种类型:

  • 聚簇索引(Clustered Index):数据行按照主键的顺序存储在磁盘上,并且主键索引就是聚簇索引。
  • 非聚簇索引(Non-Clustered Index):存储的是索引字段以及对应的主键值,数据行存储在聚簇索引中,而非聚簇索引通过主键来访问数据。

5. 插入缓冲(Insert Buffer)

为了提高插入性能,InnoDB会使用插入缓冲来延迟更新索引。插入缓冲会先将插入操作保存在内存中的缓冲区(即插入缓冲),并在合适的时机将这些修改刷新到磁盘上的索引页中。

6. 锁机制

InnoDB支持多种锁机制,主要有行级锁和表级锁:

  • 行级锁:锁定的是特定的行,允许多个事务同时修改不同的行,支持并发性。
  • 表级锁:锁定整个表,其他事务不能对该表进行修改操作,支持较低的并发性。

7. 双写缓冲 (Doublewrite Buffer)

为了确保数据在崩溃恢复时的一致性,InnoDB使用双写缓冲(doublewrite buffer)。数据首先被写入一个双写缓冲区,然后再写入实际的表空间。这可以保证在写入过程中出现崩溃时数据不会丢失或损坏。

8. 段 (Segment)

InnoDB使用段来组织磁盘上的数据结构。每个表、索引、数据等都可以被划分到一个段中。段负责管理多个页。

9. 事务日志 (Transaction Log)

InnoDB通过事务日志来支持事务的ACID特性。事务日志包括:

  • 重做日志(Redo Log):用于恢复事务提交后的操作。所有的修改操作都先记录到Redo Log,然后再更新到数据文件中。
  • 撤销日志(Undo Log):用于回滚未提交的事务,保证数据一致性。
  • 二进制日志(Binary Log):记录数据库的所有更改(包括DDL和DML操作),用于复制和数据恢复。

10. 自适应哈希索引 (Adaptive Hash Index)

为了提高查询性能,InnoDB还支持自适应哈希索引。当InnoDB发现某个索引的访问模式较为频繁时,它会自动创建哈希索引来加速查询。

11. 自适应索引刷新

InnoDB的缓存管理器会定期刷新索引和数据页,尤其是在内存压力较大的情况下,系统会自动决定哪些页需要刷新到磁盘上,以保持性能。

总结

InnoDB的逻辑存储结构包括了表空间、页、簇、B+树、插入缓冲、锁机制、双写缓冲、段、日志等多个重要组成部分。这些设计帮助InnoDB提供高效的事务处理、数据存储、索引管理以及高并发支持。

如果你对某个具体部分有更深的兴趣,或者需要更详细的解析,可以继续问我!


http://www.kler.cn/a/522653.html

相关文章:

  • PostgreSQL 数据备份与恢复:掌握 pg_dump 和 pg_restore 的最佳实践
  • 危机13小时:追踪一场GitHub投毒事件
  • 低代码产品表单渲染架构
  • WSL 安装cuDNN
  • C语言自定义数据类型详解(二)——结构体类型(下)
  • Vue 3 + TypeScript 实现父子组件协同工作案例解析
  • 第13章 深入volatile关键字(Java高并发编程详解:多线程与系统设计)
  • 蓝桥杯例题三
  • AWS Snowball
  • MySQL 事件调度器
  • 【Java数据结构】了解排序相关算法
  • maven、npm、pip、yum官方镜像修改文档
  • 学习ASP.NET Core的身份认证(基于JwtBearer的身份认证10)
  • 基于RIP的MGRE VPN综合实验
  • DNS解析防护应措施有哪些?
  • 【算法】Master Theorem 计算递归算法的时间复杂度
  • Baklib如何优化企业知识管理实现全面数字化升级与协同创新
  • K8S中高级存储之PV和PVC
  • 【嵌入式】总结——Qt开发(四)
  • java后端之登录认证
  • C# 添加、替换、提取、或删除Excel中的图片
  • C语言练习(28)
  • maven的打包插件如何使用
  • CNN-GRU卷积门控循环单元时间序列预测(Matlab完整源码和数据)
  • 在做题中学习(81):替换后的重复字符
  • L30.【LeetCode题解】丢失的数字