购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 存储引擎层

本节主要介绍InnoDB存储引擎,其架构如图2-3所示。

从图2-3中可以清晰地看到InnoDB存储引擎的两大核心组成部分:上半部分聚焦于内存中的组件;下半部分则涵盖底层的文件结构。接下来,我们将基于图2-3对各个组件进行简要的介绍。

图2-3 InnoDB存储引擎架构

2.2.1 缓冲池

缓冲池是InnoDB存储引擎中的一个至关重要的组件,其核心功能在于缓存数据页、回滚页,插入缓冲以及自适应哈希等关键数据。在日常操作中,无论是读取还是写入,所处理的数据均会先经过缓冲池。该组件负责将磁盘上数据文件中相应的数据页加载至其维护的内存区域中,并借助链表等数据结构对这些数据页进行高效管理。

值得注意的是,除了回滚页缓存和索引页缓存外,InnoDB的插入缓冲和自适应哈希机制也依赖于缓冲池中的内存资源,下面简单地介绍一下。

1.插入缓冲区

插入缓冲区的设计初衷在于优化MySQL数据库中二级索引的随机I/O操作。该机制通过合并原本分散的随机I/O请求,有效降低了随机I/O的频率,从而提升了数据库性能。最初,该缓冲区仅支持insert语句,但随后扩展了对update和delete语句的支持,因此其名称也由insert buffer变更为change buffer。为便于理解,本章将统一采用“插入缓冲区”这一称谓。

2.自适应哈希

我们知道,MySQL的核心索引机制采用B+树结构,其中聚簇索引的叶子节点负责存储表的具体数据。然而,在应对大规模数据集时,B+树的层级可能显著增加,且各层宽度亦会扩大。具体而言,小规模数据可能仅需两级B+树即可满足需求,而大规模数据则可能需要扩展至四级,这势必影响数据检索的效率,尤其是在数据未驻留于内存时,检索速度将更为迟缓。

为解决上述问题,MySQL引入了哈希表这一数据结构,旨在通过其独特的键值映射特性,实现数据的快速定位。MySQL的策略是将高频访问的数据预先插入哈希表中,从而在后续访问时能够直接从哈希表获取所需数据,此举显著提升了数据读取的性能。

注意 自适应哈希技术虽能显著提升特定场景下的操作效率,但其应用亦受诸多条件限制,并非万能之策。因此,在实际应用中,我们需根据具体场景和需求,审慎评估并选用最为合适的数据访问策略。

2.2.2 重做日志缓冲区

重做日志缓冲区是InnoDB用于缓存重做日志记录的区域。在事务提交或后台线程触发时,该缓冲区内的内容将被同步至磁盘上的重做日志文件中,以确保数据的持久性和一致性。

2.2.3 双写机制

鉴于磁盘的基本存储单元为512 B,而MySQL数据库在进行数据读写操作时,其最小单位通常是一个数据页,该数据页的大小普遍设定为16KB。因此,在数据写入过程中,若遭遇突然断电等异常情况,可能导致数据页仅部分写入,进而引发数据页损坏及数据不一致的问题。

为解决此问题,MySQL引入了双写机制。该机制的核心策略是,在将数据页修改内容直接写入其原始数据文件之前,首先将这些修改内容临时写入一个独立的双写缓冲区文件中。一旦双写操作成功完成,MySQL随后会将这部分已确认无误的数据从双写缓冲区文件同步至其对应的数据文件中。此过程确保了即使发生断电等意外情况,也能通过双写缓冲区文件恢复数据页的一致性,从而有效避免数据损坏问题。

2.2.4 后台线程

由于InnoDB存储引擎负责数据的读写、各种特性的正常运转。所以后台开启了很多线程,每个线程负责不同的功能,MySQL后台线程如表2-1所示。

表2-1 MySQL后台线程

上述只是MySQL 5.7的线程,随着版本的叠加,MySQL会引入新的线程,并且线程的数量也可能有所变化。我们可以通过pstack MySQL的进程或者调试其启动的逻辑,找到所有的后台线程。 NKEpRJTdpn3G79ns+fUCZDGqYbtpeuFPT6z5DgSUXprolHMX8fJos5UF496NNoZX

点击中间区域
呼出菜单
上一章
目录
下一章
×