Innodb架构剖析

海哥  金牌会员 | 2024-6-11 08:43:02 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 535|帖子 535|积分 1605

整体架构

通过《口试官:一条SQL是如何实行的?》我们了解了MySQL架构,下面我们看下Innodb架构。
innodb最早由Innobase Oy公司开发,5.5版本开始是MySQL默认存储引擎,该存储引擎是第一个完整支持ACID事务的MySQL存储引擎(BDB是第一个支持事务的MySQL存储引擎,现在已经停止开发),其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有用地使用以及使用内存和CPU。下面我们具体看下innodb架构:


内存架构



  • Buffer Pool(缓冲池)是InnoDB存储引擎中的一个紧张组件,用于高效地缓存数据库中的数据页。它是内存中的一块区域,用于存储从磁盘读取的数据页,以加速数据的访问速率。在专用服务器上,通常将物理内存的最多80%分配给缓冲池。当InnoDB需要读取数据页时,起首会在缓冲池中查找该页是否已经被缓存。假如该页已经在缓冲池中,InnoDB可以直接从内存中获取数据,避免了磁盘IO的开销,从而进步数据访问的速率。假如该页不在缓冲池中,InnoDB会将其读取到缓冲池中,并举行相应的缓存管理。Buffer Pool的大小是通过配置参数innodb_buffer_pool_size来指定的。较大的缓冲池可以容纳更多的数据页,提供更好的缓存结果,从而减少磁盘IO操纵。合理配置缓冲池的大小对于数据库的性能至关紧张,它应该根据数据库的大小、可用内存和访问模式来举行调整。Buffer Pool的作用在于:

    • 进步数据访问性能:通过缓存数据页,减少磁盘IO,加速数据的读取速率。
    • 减少磁盘访问:由于数据页已经在内存中,可以减少频繁的磁盘读取操纵,降低IO开销。
    • 优化查询性能:对于频繁访问的数据,可以直接从缓冲池中获取,减少查询的响应时间。

  • Change Buffer


    Change Buffer是一种特别的数据结构,用于在次要索引页不在缓冲池中时缓存对其举行的更改。这些缓冲的更改大概来自于插入(INSERT)、更新(UPDATE)或删除(DELETE)操纵(DML),它们在后续的读操纵将这些页加载到缓冲池时被合并。Change Buffer的目的是降低写操纵的磁盘IO,提升数据库性能。
  • Log Buffer 当在MySQL中对InnoDB表举行更改时,这些更改起首存储在InnoDB日志缓冲区的内存中(Log Buffer),然后写入通常称为重做日志(redo logs)的InnoDB日志文件中。日志缓冲区的大小由innodb_log_buffer_size 变量定义,其默认大小为16MB。日志缓冲区的内容会定期刷新到磁盘。较大的日志缓冲区可以使大型事务在提交之前无需将重做日志数据写入磁盘,从而提供更好的性能。因此,假如存在更新、插入或删除大量行的事务,则增加日志缓冲区的大小可以减少磁盘IO操纵。 innodb_flush_log_at_trx_commit变量控制日志缓冲区的内容如何写入和刷新到磁盘。innodb_flush_log_at_timeout 变量控制日志刷新的频率。
磁盘架构

InnoDB存储引擎使用页作为根本单元来管理存储空间,每个页的默认大小为16KB。对于每个索引,InnoDB使用B+树结构,此中每个节点都是一个数据页。数据页之间不必一连存储,而是通过双向链表来维护它们的顺序。
InnoDB的聚簇索引将完整的用户记录存储在叶子节点中,也就是说索引即数据,数据即索引。
为了更好地管理这些页,InnoDB引入了表空间(Tablespace)的概念。表空间是一个抽象的概念,可以对应于一个或多个实际的文件。每个表空间可以被分别为多个页,表的数据存放在特定表空间下的一些页中。InnoDB将表空间分别为几种不同的范例:

  • 体系表空间(System Tablespace):体系表空间可以对应文件体系上一个或多个实际的文件,默认情况下,InnoDB会在数据目录下创建一个名为ibdata1的文件,这个文件就是对应的体系表空间在文件体系上的表示。这个文件是自扩展文件,当不够用的时候它会自己增加文件大小。也可以把体系表空间对应的文件路径不配置到数据目录下,乃至可以配置到单独的磁盘分区上,涉及到的启动参数就是innodb_data_file_path和innodb_data_home_dir。需要留意的一点是,在一个MySQL服务器中,体系表空间只有一份。
  • 独立表空间(File-per-table Tablespace):在MySQL5.6.6以及之后的版本中,InnoDB并不会默认把各个表的数据存储到体系表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件,文件名和表名相同,只不外添加了一个.ibd的扩展名。我们也可以自己指定使用体系表空间还是独立表空间来存储数据,这个功能由启动参数innodb_file_per_table控制。
  • 通用表空间(General Tablespace):通用表空间是MySQL 8中引入的新特性,它答应将多个表存储在一个表空间中。通用表空间可以跨数据库和服务器共享,提供了更高的机动性和资源使用率。
  • 临时表空间(Temporary Tablespaces):临时表空间用于存储临时表和临时文件。当实行排序、连接和其他需要临时存储的操纵时,InnoDB会使用临时表空间来存储相关数据。
此外,InnoDB还使用其他文件和机制来支持数据管理和规复:

  • 双写缓冲文件(Doublewrite Buffer Files):双写缓冲是一种机制,用于进步数据写入的可靠性。InnoDB将数据页起首写入双写缓冲文件中,然后再将其写入实际的数据文件。这样可以在发生故障时,通过双写缓冲文件规复数据的一致性。
  • Undo表空间(Undo Tablespaces):撤消表空间用于存储撤消日志(undo log),用于支持事务的回滚和MVCC(多版本并发控制)。每个事务对数据的修改都会天生相应的撤消日志,这些日志被存储在撤消表空间中。
  • 重做日志(Redo Log):重做日志是用于事务的长期性和故障规复的紧张组件。它记录了事务对数据的修改操纵,包括插入、更新和删除。重做日志文件存储在磁盘上,并在事务提交时举行长期化。
这些组件和机制共同构成了InnoDB的磁盘架构,用于管理和存储数据。
InnoDB的工作流程

当用户发起一个数据操纵哀求时,InnoDB的处置惩罚流程大致如下:

  • 事务开始:InnoDB为每个事务分配一个唯一的事务ID,并在事务开始时创建一个事务对象。
  • 数据读取:假如数据不在缓冲池中,InnoDB会从磁盘读取数据页面到缓冲池。
  • 数据修改:修改操纵起首在缓冲池中举行,同时记录到重做日志缓冲区。
  • 日志写入:日志缓冲区定期刷新到重做日志文件,确保数据的长期性。
  • 提交事务:在事务提交时,InnoDB确保全部相关的重做日志已经写入磁盘,这个过程称为预写日志协议(Write-Ahead Logging, WAL)。
  • 背景处置惩罚:事务提交后,InnoDB的背景线程会负责将缓冲池中修改过的页面异步刷新到磁盘,同时合并插入缓冲和维护其他内部结构。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

海哥

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表