【深入浅出你必须知道的 InnoDB 底层设计

2023年 7月 14日 79.0k 0

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO TOP红人

💕💕 感兴趣的同学可以收藏关注下 ,不然下次找不到哟💕💕

✊✊ 感觉对你有帮助的朋友,可以给博主一个三连,非常感谢 🙏🙏🙏

在这里插入图片描述

@[TOC]

写在前面

🔔🔔🔔面试常常会问到“你说下 Mysql 的存储引擎”,常见的回答是说出 MyISAM 和 InnoDB 的在文件、索引结构、锁等方面的区别,基本上初、中级别的能回答到差不多也就够了,但是高级及以上,还是要能说出架构设计的原理。

1、什么是 InnoDB 存储引擎

InnoDB 是事务安全的MySQL存储引擎,设计上采用了类似于 Oracle 数据库的架构。InnoDB存储引擎也是 OLTP (Online Transaction Processing 在线事务处理 )应用中核心表的首选存储引擎。

Heikki Tuuri (1964 年,芬兰赫尔辛基)是 InnoDB 存储引的创始人,同时在 InnoDB 存储引擎的开发团队中,有来自中国科技大学的 Calvin Sun。而最近又有一个中国人 Jimmy Yang 也加人了 InnoDB 存储引擎的核心开发团队,负责全文索引的开发。

InnoDB存储引擎它提供了事务支持,并具有ACID(原子性、一致性、隔离性、持久性)特性。InnoDB以其可靠性、可扩展性和性能而闻名。以下是InnoDB存储引擎的一些关键特点:

  • 🎄事务支持: I nnoDB支持事务,允许将多个数据库操作组合为一个工作单元。这确保要么所有操作都成功完成,要么都不被应用。
  • 🎄并发控制: I nnoDB使用行级锁定来管理对数据的并发访问。这意味着多个用户可以同时读取和写入表的不同行,提高并发性并减少争用。
  • 🎄外键约束: InnoDB支持外键约束,用于强制执行表之间的引用完整性。这确保数据关系得到维护,并防止孤立或不一致的数据。
  • 🎄崩溃恢复: InnoDB提供崩溃恢复功能,确保即使在系统故障或停电的情况下,数据也保持一致。它使用事务日志(也称为重做日志)来重放和恢复已提交的事务。
  • 🎄MVCC(多版本并发控制): InnoDB使用MVCC来管理并发读写操作。这允许读者在其他事务修改数据时访问一致的数据快照。
  • 🎄缓冲池: InnoDB利用缓冲池将频繁访问的数据缓存到内存中。这有助于通过减少磁盘I/O并加快数据检索来提高性能。

2、InnoDB 存储引擎的版本

InnoDB 存储引擎中一些重要版本和功能

版 本 功 能
InnoDB Plugin 从 MySQL 5.1 开始,引入了 InnoDB Plugin 作为内置 InnoDB 存储引擎的替代方案。它提供了额外的功能,如改进的性能、压缩支持和更多的调优选项。
InnoDB Barracuda 在 MySQL 5.5 中,引入了 InnoDB Barracuda 文件格式。它提供了对新功能的支持,如表压缩、动态行格式和增加的最大行大小。
InnoDB 全文搜索 在 MySQL 5.6 中,InnoDB 引入了对全文搜索功能的支持。这使得用户可以在 InnoDB 表上进行高效的全文搜索,而无需使用外部搜索引擎。
InnoDB 集群 在 MySQL 8.0 中,引入了 InnoDB 集群作为本机高可用性解决方案。它实现了自动故障转移、复制和分布式事务,为高可用性应用程序提供了强大而可扩展的解决方案。
InnoDB 页面压缩 InnoDB 页面压缩在 MySQL 5.7 中引入。它允许对单个 InnoDB 页面进行压缩,从而减少磁盘空间使用量并提高 I/O 性能。

3、InnoDB体系架构

在这里插入图片描述
从上面图可以看出 InnoDB 存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,主要负责如下工作:

  • 🎄数据缓存: 缓冲池用于缓存数据库中的数据页。当查询需要读取数据时,首先在缓冲池中查找,如

  • 🎄数据修改: 当有数据修改操作(如插入、更新、删除)时,InnoDB会将修改的数据页加载到缓冲池中进行修改。修改后的数据页会被标记为“脏页”,表示数据已经发生了变化。

  • 🎄数据写回: 当缓冲池中的脏页数量达到一定阈值或者发生数据库提交操作时,InnoDB会将脏页的数据写回到磁盘中的数据文件。这个过程称为“脏页刷新”(dirty page flushing)。

  • 🎄数据淘汰: 当缓冲池空间不足时,InnoDB会根据一定的策略淘汰一些不常用的数据页,以腾出空间给新的数据页使用。淘汰的数据页会被写回到磁盘,以保证数据的持久性。

  • 🎄并发控制: 缓冲池还负责管理并发控制机制,如行级锁定和多版本并发控制(MVCC),以确保事务之间的数据访问不会发生冲突。

  • 3.1、🐧 后台线程

    InnoDB体系架构中的后台线程具有不同的角色和职责。以下是主要的后台线程及其功能:

  • 🎄主线程(Master Thread): 主线程负责协调其他后台线程的活动。它执行诸如检查点、将脏页刷新到磁盘和管理缓冲池等任务。

  • 🎄IO线程(IO Thread): InnoDB使用多个IO线程来异步处理磁盘IO操作。这些线程负责从磁盘读取和写入数据,允许并发执行数据库操作。

  • 🎄清理线程(Purge Thread): 清理线程负责在InnoDB中进行垃圾回收。它识别并删除对于任何活动事务不再需要的旧版本记录。该线程通过回收占用过时数据的空间来帮助维护存储引擎的效率。

  • 🎄页面清理线程(Page Cleaner Thread): 页面清理线程负责从缓冲池中清理脏页。它识别并将修改后的页面写回磁盘,以确保缓冲池具有足够的空间来存储新数据。该线程有助于在内存和磁盘之间保持数据的平衡。

  • 🎄自适应哈希索引线程(Adaptive Hash Index Thread): 自适应哈希索引(AHI)线程负责动态管理自适应哈希索引结构。它监视哈希索引的使用模式,并根据需要调整其大小以优化性能。

  • 3.2、🐧 内存

    InnoDB体系架构中,内存扮演着重要的角色。以下是内存在InnoDB中的几个关键作用:

  • 🎄 数据缓存池(Buffer Pool): 内存中最重要的组件之一是数据缓存池,它用于存储InnoDB表的数据和索引。数据缓存池以页(Page)为单位进行管理,将磁盘上的数据加载到内存中,从而提供快速的数据访问和查询性能。

  • 🎄 重做日志缓冲区(Redo Log Buffer): 内存中的重做日志缓冲区用于暂存事务的重做日志,这些日志记录了对InnoDB表的更改操作。重做日志缓冲区的存在可以提高事务的持久性和恢复能力。

  • 🎄共享表空间缓存(Shared Tablespaces Cache): InnoDB引擎支持共享表空间的概念,多个表可以共享同一个表空间文件。内存中的共享表空间缓存用于管理和缓存共享表空间的元数据和相关信息。

  • 🎄自适应哈希索引(Adaptive Hash Index): 内存中的自适应哈希索引用于加速InnoDB表的索引访问。它是一个基于内存的数据结构,用于快速查找和定位索引中的数据。

  • 🎄 LRU List、Free List 和 Flush List:

    • LRU List(最近最少使用列表):LRU List是InnoDB内存管理的关键部分,用于管理数据缓存池中的页。它采用最近最少使用的策略,将最近使用的页放在列表的前面,而最少使用的页放在列表的后面。当需要从磁盘加载新的页时,InnoDB会从LRU List的末尾选择最少使用的页进行替换。
    • Free List(空闲列表):Free List用于管理空闲页的链表。当InnoDB需要新的页来存储数据时,它会首先从Free List中查找空闲页。如果Free List中没有足够的空闲页,InnoDB会从磁盘上分配新的页,并将其添加到Free List中。
    • Flush List(刷新列表):Flush List用于管理脏页(已被修改但尚未写回磁盘的页)的列表。当InnoDB需要释放内存或者保证数据持久性时,它会将脏页写回磁盘。Flush List维护了一个列表,记录了需要写回磁盘的脏页的位置和状态。
  • 🎄 额外的内存池:

    • 描述性数据结构内存池:InnoDB使用描述性数据结构来管理表和索引的元数据信息,例如表结构、索引结构等。这些描述性数据结构存储在内存池中,以提供对表和索引的快速访问。
    • 锁信息内存池:InnoDB使用锁来实现事务的并发控制。为了管理锁的状态和信息,InnoDB维护了一个锁信息内存池。这个内存池存储了活跃事务的锁信息,以及其他与锁相关的数据结构。
    • 事务信息内存池:InnoDB使用事务信息内存池来存储活跃事务的相关信息,如事务ID、事务状态等。这些信息对于实现事务的隔离性和持久性非常重要。
    • 回滚段内存池:InnoDB使用回滚段来实现事务的回滚和撤销操作。回滚段内存池用于存储回滚段的相关信息,包括回滚段的状态、大小等。
  • 4、Checkpoint 技术

    InnoDB体系架构中的Checkpoint技术是用来确保数据的持久性和一致性的重要机制。当数据库执行写操作时,数据会首先被写入到内存缓冲池(Buffer Pool)中,而不是直接写入磁盘。为了将数据持久化到磁盘,InnoDB引擎会定期执行Checkpoint操作。

    🎄Checkpoint操作的主要目的:是将内存中的数据写入到磁盘中的数据文件,同时更新相关的元数据。这样可以确保在数据库发生异常情况(如系统崩溃)时,能够通过恢复机制将数据重新加载到内存中,保证数据的一致性和完整性。

    🎄Checkpoint技术的实现方式:是通过将脏页(被修改但尚未写入磁盘的页)刷新到磁盘上的数据文件。脏页是指在内存中已经被修改的数据页,而没有及时写入磁盘。Checkpoint操作会将这些脏页写入到磁盘中的对应数据文件位置,并更新相关的元数据信息。

    Checkpoint操作的触发条件可以是时间间隔、日志文件大小、或者是系统负载等。当满足触发条件时,InnoDB会自动执行Checkpoint操作。执行Checkpoint操作时,会暂停对数据库的写入操作,以确保数据的一致性。

    通过Checkpoint技术,InnoDB能够在保证性能的同时,确保数据的持久性和一致性。它是InnoDB引擎的重要特性之一,对于数据库的可靠性和稳定性起到了关键作用。

    5、Master Thread

    InnoDB体系架构中的Master Thread(主线程)是一个关键的后台线程,负责处理许多重要的任务和操作。它的作用如下:

  • 🎄锁管理:Master Thread负责管理InnoDB引擎中的锁。它会检查和处理事务中的锁请求,确保并发事务之间的数据访问的正确性和一致性。

  • 🎄事务回滚:当一个事务需要回滚时,Master Thread会负责执行回滚操作。它会撤销已经对数据所做的修改,将数据恢复到之前的状态。

  • 🎄MVCC(多版本并发控制):Master Thread会处理MVCC相关的操作。MVCC是InnoDB引擎实现并发控制的一种方式,通过为每个事务创建独立的版本来实现数据的并发访问。

  • 🎄刷新脏页:Master Thread负责定期执行刷新脏页的操作。脏页是指在内存中已经被修改的数据页,而没有及时写入磁盘。Master Thread会将脏页刷新到磁盘,确保数据的持久性和一致性。

  • 🎄后台I/O操作:Master Thread还负责处理后台的I/O操作。这包括读取和写入数据文件、日志文件以及其他与磁盘交互的操作。

  • 总之,InnoDB体系架构中的Master Thread是一个关键的后台线程,负责处理锁管理、事务回滚、MVCC、脏页刷新以及后台I/O操作等任务。它的工作流程步骤确保了数据库的并发性、一致性和持久性。

    6、InnoDB 关键特性

    InnoDB存储引的关键特性包括

  • 🎄插入缓冲(Insert Buffer)
  • 🎄两次写(Double Write)
  • 🎄自适应哈希索引(Adaptive Hash Index)
  • 🎄异步IO(Async IO)
  • 🎄刷新邻接页(Flush Neighbor Page)
  • 上述这些特性为 InnoDB 存储引警带来更好的性能以及更高的可靠性

    6.1、🐧 插入缓冲

    InnoDB体系架构中的插入缓冲(Insert Buffer)是一种用于提高写入性能的机制。它在数据页中记录了正在进行的插入操作,以减少磁盘I/O的次数。
    插入缓冲的工作原理如下:

  • 🎄 当有插入操作时,InnoDB引擎会将插入的数据先存储在插入缓冲中,而不是直接写入磁盘。

  • 🎄 插入缓冲是一个类似于哈希表的数据结构,它存储了正在进行的插入操作的相关信息,包括插入的数据和对应的索引信息。

  • 🎄 当插入缓冲被填满或者发生某些特定的事件时,InnoDB引擎会将插入缓冲中的数据按照顺序合并到磁盘中的数据页中。

  • 🎄 合并过程中,InnoDB引擎会将插入缓冲中的数据按照索引顺序进行排序,然后一次性写入到磁盘,减少了磁盘I/O的次数。

  • 🎄 插入缓冲的数据合并操作是在后台线程中进行的,不会阻塞用户的查询操作。

  • 通过使用插入缓冲,InnoDB引擎能够将多个小的插入操作合并为一个较大的写入操作,从而提高了写入性能。插入缓冲的使用可以减少磁盘I/O的次数,降低了写入操作对数据库性能的影响。

    6.2、🐧 两次写

    在这里插入图片描述
    InnoDB体系架构中的"两次写"(Double Write)是一种保证数据页写入安全性的机制。它通过在写入磁盘之前先将数据页写入到一个特定的区域,然后再写入到目标位置,来防止数据页写入过程中的数据损坏或丢失。

    "两次写"的工作原理如下:

    🎄1. 当InnoDB引擎需要将数据页写入磁盘时,首先将数据页的副本写入到"两次写"区域。

    🎄2. "两次写"区域是一个连续的磁盘区域,其大小通常为16个数据页大小。

    🎄3. 在将数据页写入"两次写"区域后,InnoDB引擎再将数据页写入到目标位置,如磁盘的数据文件。

    🎄4. 当数据页写入到目标位置后,InnoDB引擎会将对应的"两次写"区域中的数据标记为无效,以便下次重用。

    通过使用"两次写"机制,InnoDB引擎可以提供更高的数据页写入安全性。即使在数据页写入过程中发生意外情况,如系统崩溃或磁盘故障,"两次写"机制也能够保证数据的完整性。在数据库重启后,InnoDB引擎会检查"两次写"区域中的数据,如果发现数据页在目标位置上没有正确写入,会使用"两次写"区域中的数据进行恢复。

    "两次写"机制是InnoDB引擎为了保证数据页写入的安全性而采取的一种策略。它通过先将数据页写入到一个特定的区域,然后再写入到目标位置,来防止数据写入过程中的损坏或丢失。

    6.3、🐧 自适应哈希索引

    InnoDB体系架构中的自适应哈希索引(Adaptive Hash Index)是一种用于提高查询性能的索引结构。它是InnoDB引擎在内存中维护的一种辅助索引结构,用于加速对数据的查询操作。

    自适应哈希索引的工作原理如下:

  • 🎄当一个表在InnoDB引擎中被访问时,InnoDB会根据数据的访问模式自动选择是否创建自适应哈希索引。

  • 🎄自适应哈希索引会根据查询的频率和模式,动态地选择性地将部分数据页加载到内存中的哈希索引结构中。

  • 🎄当查询发生时,InnoDB引擎首先会检查自适应哈希索引中是否存在相关的索引数据。

  • 🎄如果自适应哈希索引中存在相关的索引数据,InnoDB引擎会直接使用哈希索引进行查询,从而避免了对磁盘上的数据页的访问,提高了查询性能。

  • 🎄如果自适应哈希索引中不存在相关的索引数据,InnoDB引擎会退化为使用B+树索引进行查询。

  • 自适应哈希索引的优点是可以根据实际的查询模式自动选择是否创建哈希索引,并且可以动态地调整索引数据的加载量,以适应不同的查询负载。它可以在一定程度上提高查询性能,特别是对于频繁访问的数据,可以减少磁盘IO的开销。

    需要注意的是,自适应哈希索引只存在于内存中,当数据库重启时会丢失。因此,在数据库重启后,InnoDB引擎会重新根据数据的访问模式来决定是否创建自适应哈希索引。

    6.4、🐧 异步 IO

    InnoDB体系架构中的异步IO(Asynchronous IO)是一种提高IO性能的技术。在传统的同步IO模式下,当应用程序发起IO请求时,会阻塞等待IO操作完成,然后再继续执行后续的操作。而异步IO则不会阻塞应用程序的执行,而是通过将IO请求提交给操作系统,然后继续执行后续的操作,等待IO操作完成后再进行处理。

    在InnoDB体系架构中,异步IO主要应用在后台写操作(write-ahead logging)和刷新脏页(flushing dirty pages)的过程中。具体的工作流程如下:

  • 🎄当应用程序执行写操作时,InnoDB引擎会将写请求放入到一个专门的异步IO队列中,然后立即返回给应用程序,不会阻塞应用程序的执行。

  • 🎄后台的IO线程会从异步IO队列中获取写请求,并将其提交给操作系统进行异步写入磁盘的操作。

  • 🎄当IO操作完成后,IO线程会通知InnoDB引擎,然后InnoDB引擎会继续执行后续的操作,如更新日志(redo log)和刷新脏页等。

  • 异步IO的优点是可以提高IO操作的并发性和吞吐量,减少IO操作对应用程序的影响。通过异步IO,InnoDB引擎可以在后台执行IO操作,而不会阻塞应用程序的执行,从而提高系统的性能和响应速度。

    需要注意的是,异步IO的效果受到操作系统和硬件设备的支持程度的影响。不同的操作系统和硬件设备对异步IO的支持程度可能有所不同,因此在使用异步IO时需要进行适当的配置和优化,以充分发挥其性能优势。

    6.5、🐧 刷新邻接页

    InnoDB体系架构中的刷新邻接页(Flush Neighbor Pages)是一种优化策略,旨在减少IO操作的次数,提高性能。在InnoDB存储引擎中,邻接页是指在磁盘上相邻的多个页,通常是连续的页。刷新邻接页的过程可以通过以下步骤来实现:

  • 🎄当InnoDB引擎需要将脏页(Dirty Pages)刷新到磁盘时,它会首先检查脏页的邻接页是否也是脏页。

  • 🎄如果邻接页也是脏页,那么InnoDB引擎会将这些脏页一起刷新到磁盘,而不是单独刷新每个脏页。

  • 🎄这样做的好处是可以减少IO操作的次数,提高IO的效率。因为相邻的页通常在磁盘上是连续存储的,一次刷新多个脏页可以减少寻道和旋转延迟的开销。

  • 刷新邻接页的优点是可以提高IO操作的效率和性能。通过一次性刷新多个脏页,可以减少IO操作的次数,从而减少磁盘访问的开销。这对于提高系统的吞吐量和响应速度非常有帮助。

    需要注意的是,刷新邻接页的策略是由InnoDB引擎自动管理的,通常不需要手动干预。InnoDB引擎会根据内部的算法和策略来判断是否需要刷新邻接页。在大多数情况下,InnoDB引擎会自动选择最合适的时机和方式来刷新邻接页,以达到最佳的性能和效果。

    写在后面

    总的来说,InnoDB提供了强大的事务支持、并发控制、数据完整性保护和高性能等优点,使得它成为许多应用程序首选的存储引擎。

    💕💕 本文由激流原创,原创不易,希望大家关注、点赞、收藏,给博主一点鼓励,感谢!!!
    在这里插入图片描述

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论