暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

InnoDB存储引擎架构浅析

原创 闫建 云和恩墨 2022-07-27
2275

InnoDB引擎架构

    InnoDB存储引擎当前已经成为MySQL默认存储引擎,基本上使用MySQL数据库的用户都再使用InnoDB,在早期版本的其他存储引擎使用场景越来越少,已经随着时间的发展逐渐退出历史舞台,现将针对InnoDB引擎架构进行简单说明,用官方的一张图来展示如下:
image.png

InnoDB架构分类

    从InnoDB存储引擎官方说明来看主要分成两部分:

  • 内存架构
  • 磁盘架构

内存架构:

内存方面主要分为4个部分:

  • Buffer Pool
  • Change Buffer
  • Log Buffer
  • Adaptive Hash Index

Buffer Pool:Buffer Pool是Innodb内存中的一块占比较大的区域,用来缓存表和索引数据,主要包含三张链表(LRU List, Free List, Flush List)和三种Page(Free Page,Clean Page,Dirty Page)。Buffer Pool 对应参数为innodb_buffer_pool_size 从5.7版本后可以进行在线动态调整,整个Buffer Pool的说明用一张图来概括如下:
image.png
buffer pool的一些详细信息可以从MySQL命令 show engine innodb status\G 中获取如下:
image.png

Change Buffer:在MySQL5.5之前,叫插入缓冲(Insert Buffer),只针对INSERT做了优化;现在对DELETE和UPDATE也有效,叫做写缓冲(Change Buffer)。它是一种应用在非唯一普通索引页(non-unique secondary index page)不在缓冲池中,对页进行了写操作,并不会立刻将磁盘页加载到缓冲池,而仅仅记录缓冲变更(Buffer Changes),等未来数据被读取时,再将数据合并(Merge)恢复到缓冲池中的技术。写缓冲的目的是降低写操作的磁盘IO,提升数据库性能。详细说明如下:
image.png
image.png

Log Buffer:也叫日志缓冲区,当在MySQL中对InnoDB表进行数据更改时,这些更改首先存储在InnoDB日志缓冲区的内存中,然后再写入通常称为重做日志(redo logs)的InnoDB日志文件中。
日志缓冲区log buffer是内存存储区域,用于保存要写入磁盘上的日志文件的数据。日志缓冲区大小由innodb_log_buffer_size 变量定义,默认大小为16MB。
日志缓冲区的内容定期刷新到磁盘。较大的日志缓冲区可以运行大型事务,而无需在事务提交之前将重做日志数据写入磁盘。因此,如果有更新,插入或删除许多行的事务,则增加日志缓冲区的大小可以节省磁盘I/O。
这里还涉及到一个参数 innodb_flush_log_at_trx_commit :控制如何将日志缓冲区的内容写入并刷新到磁盘,默认为1,不建议修改,代表每次提交时进行刷新磁盘。

Adaptive Hash Index-AHI:自适应哈希索引用于优化对BP数据的查询。InnoDB存储引擎会监 控对表索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以 称之为自适应。InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立哈希索引。(在高负载系统下AHI容易产生资源的争用,进而引起一些bug导致系统受影响甚至崩溃,故建议关闭该功能)
image.png

磁盘架构:

从MySQL8.0开始,MySQL在磁盘架构方面也进行了一些改进,比如:将undo表空间从系统表空间中独立出来默认为2个undo file;double write buffer files 也从系统表空间中独立出来,形成两个.dblwr结尾的文件;系统表空间由于8.0数据字典都变为innodb存储引擎,形成独立表空间,不再有MyISAM引擎表,系统表空间中主要被change buffer占据。
image.png

从上图可以看出,从8.0版本开始:用户表空间,临时表空间,undo,redo, double write buffer file 这些都已经从系统表空间ibdata中独立开来,老版本5.7之前基本上都是在系统表空间中一起管理(redo log file除外),这里再用一张图来详细讲解一下 double write
image.png
以上InnoDB存储架构中,无论内存架构还是磁盘架构都有对应的知识点和相关系统参数,在运维过程中需要我们对这些知识点进行详细理解,而且官方文档中都有详细说明,读官方文档是个很好的途径和手段。

InnoDB引擎的限制

    InnoDB引擎在使用中需要注意如下几点:

  • 一个表最多可以包含1017列,虚拟列包含在此限制中
  • 一个表最多可以包含64个二级索引
  • InnoDB对于使用 DYNAMIC 或 COMPRESSED 行格式 的表,索引键前缀长度限制为 3072 字节
  • 多列索引最多允许 16 列。超过限制会返回错误
    ERROR 1070 (42000): Too many key parts specified; max 16 parts allowed
    
  • InnoDB日志文件(redo log file size)的最大总大小为512GB
  • 最小表空间大小略大于 10MB。最大表空间大小取决于InnoDB页大小,最大表空间大小也是表的最大大小。
    InnoDB页面大小 最大表空间大小
    4K 16T
    8K 32T
    16K 64T
    32K 128T
    64K 256T
  • 一个InnoDB实例最多支持 2^32 (4294967296) 个表空间,其中少数表空间保留用于撤消表和临时表
  • 共享表空间最多支持 2^32 (4294967296) 个表。
  • 表空间文件的路径,包括文件名,在 Windows 上不能超过MAX_PATH限制。在 Windows 10 之前,MAX_PATH限制为 260 个字符。从 Windows 10 版本 1607 开始, MAX_PATH常见 Win32 文件和目录功能的限制已删除,但您必须启用新行为。

参考文档

https://dev.mysql.com/doc/refman/8.0/en/innodb-architecture.html

最后修改时间:2022-07-27 14:48:33
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论