本文共 1785 字,大约阅读时间需要 5 分钟。
InnoDB 是 MySQL 早期版本的默认存储引擎,因其支持事务处理和并发控制而被广泛采用。本文将从缓存机制、页面管理、日志记录等方面深入探讨 InnoDB 引擎的核心架构。
InnoDB 引擎主要由内存结构和磁盘结构两部分组成。其内存结构负责缓存数据和索引以减少磁盘 IO 开销,而磁盘结构则存储实际的数据和索引文件。
InnoDB 内存结构包括两个主要部分:缓存池(Buffer Pool)和控制块。缓存池用于存储数据页和索引页,而控制块则记录缓存页的相关信息,包括表空间 ID、页号等。
Buffer Pool 是 InnoDB 的核心缓存机制,主要用于缓存表数据和索引数据。缓存池默认大小为 128MB,每个数据页大小为 16KB,控制块占用约 5% 的空间。
InnoDB 的页面管理分为三种状态:空闲页(Free Page)、干净页(Clean Page)和脏页(Dirty Page)。空闲页用于缓存未使用的数据,干净页为已加载但未修改的数据,脏页则为已修改但尚未写入磁盘的数据。
Buffer Pool 作为内存缓存池,通过控制块记录缓存页的相关信息,有效地减少了磁盘 IO 操作。
InnoDB 使用哈希表判断数据页是否已缓存在 Buffer Pool 中。哈希表的键为表空间 ID 和页号,值为对应的控制块。
空闲页 (Free Page):未被使用的缓存页,占用内存但未加载数据。
干净页 (Clean Page):已加载数据且未修改的缓存页。
脏页 (Dirty Page):已加载数据并进行了修改,但尚未写入磁盘的缓存页。
InnoDB 使用三种链表管理 Page:
Change Buffer 用于优化对二级索引页的更新操作,主要用于减少磁盘 IO 开销。
Change Buffer 是写缓冲区,用于缓存对二级索引页的更新操作,最大可占 Buffer Pool 的 50%。
对于普通索引页,若数据未命中缓存池,则将更新记录到 Change Buffer 中,待数据被读取时批量合并到缓存池。
对于唯一索引,需直接加载数据页进行修改,不涉及 Change Buffer。
适用于写多读少的业务场景,如账单系统等,Change Buffer 能显著减少磁盘 IO 操作。
Log Buffer 用于记录 InnoDB 的日志数据,主要用于事务恢复和 crash-safe 操作。
Log Buffer 内容定期刷新到磁盘,默认大小为 16MB。
可通过参数 innodb_log_buffer_size 调整日志缓冲区大小,减少磁盘 IO 操作。
flush_log_at_trx_commit=1:在事务提交时立即刷盘,数据安全性高,但 IO 操作频繁。
flush_log_at_trx_commit=0:在事务提交时刷盘每隔 1 秒执行,可能丢失最多 1 秒数据。
InnoDB 利用自适应哈希索引优化查询性能,通过监控索引访问频率动态决定是否建立哈希索引。
InnoDB 引擎通过缓存机制、页面管理和日志记录等核心机制,显著提升了数据库性能。Buffer Pool、Change Buffer 和 Log Buffer 等组件分别负责数据缓存、增删改查优化和事务安全,构成了 InnoDB 引擎高效运行的基础。
转载地址:http://zydfk.baihongyu.com/