MySQL 存储引擎 InnoDB 内存结构之缓冲池

这篇具有很好参考价值的文章主要介绍了MySQL 存储引擎 InnoDB 内存结构之缓冲池。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

缓冲池是主存储器中的一个区域,在访问 table 和索引数据时InnoDB会对其进行缓存。缓冲池允许直接从内存中访问频繁使用的数据,从而加快处理速度。在专用服务器上,通常将高达 80% 的物理内存分配给缓冲池。

为了高效处理大量读取操作,缓冲池被划分为可以容纳多行数据的页面。为了有效管理缓存,缓冲池被实现为页面的链接列表;通过 LRU(least recently used)算法的变体将很少使用的数据从缓存中淘汰出去。

了解如何利用缓冲池将频繁访问的数据保留在内存中是MySQL调优的重要方面之一。

缓冲池 LRU 算法

缓冲池使用一种最近最少使用(LRU)算法的变体作为列表进行管理。当需要空间以将新页面添加到缓冲池时,最近最少使用的页面会被移除,并将新页面添加到列表的中间。这种中点插入策略将列表视为两个子列表:

  • 在前面是最近访问过的新("young")页面的子列表;
  • 在尾部是最近较少被访问的旧("old")页面子列表。

缓冲池列表如下图所示:

MySQL 存储引擎 InnoDB 内存结构之缓冲池

该算法将频繁使用的页面保留在新页面子列表中。旧页面子列表则包含较少被使用的页面,这些页面是可能被淘汰(eviction)的候选页面。

默认情况下,算法运行如下:

  • 缓冲池的 3/8 专门用于旧页面子列表。
  • 列表的中点是新页面子列表的尾部与旧页面子列表的头部相遇的边界位置。
  • InnoDB将一个页面读入缓冲池时,它最初会插入到中点位置(旧页面子列表的头部)。一个页面可以被读取,因为它是用户发起的操作(例如 SQL 查询)所必需的,或者是InnoDB自动执行的预读(read-ahead)操作的一部分。
  • 访问旧页面子列表中的一个页面会使其变为"young",并将其移动到新页面子列表的开头。如果页面由于用户发起的操作而被读取,则将立即进行首次访问,并且页面会被标记为"young"。如果页面是由于预读操作而被读取,则第一次访问不会立即发生,并且在该页面被淘汰之前可能根本不会发生。
  • 随着数据库的运行,缓冲池中未被访问的页面会通过向列表的尾部移动而"老化"。新页面子列表和旧页面子列表中的页面都会随着其他页面的更新而老化。旧页面子列表中的页面也会随着在中点插入页面而老化。最终,一个长时间未被使用的页面会到达旧页面子列表的尾部并被淘汰。

默认情况下,通过查询读取的页面会立即移动到新页面子列表中,这意味着它们在缓冲池中停留的时间更长。例如,对于执行mysqldump操作或不带WHERE子句的SELECT语句进行的表扫描,可能会将大量数据带入缓冲池,并淘汰相同数量的较旧数据,即使新数据永远不会再次使用。同样地,由预读取后台线程加载且仅访问一次的页面会移动到新页面子列表的开头。这些情况会将频繁使用的页面推入旧页面子列表,使其面临淘汰的风险。关于优化这种行为的信息,请参阅"使缓冲池具有扫描抵抗力"和"配置 InnoDB 缓冲池预取(预读)"。

InnoDB标准监视器(Standard Monitor)的输出在BUFFER POOL AND MEMORY部分中包含了几个与缓冲池 LRU 算法操作有关的字段。有关详细信息,请参阅使用 InnoDB 标准监视器监控缓冲池。

缓冲区配置

您可以配置缓冲池的各个方面以提高性能。

  • 理想情况下,您应该将缓冲池的大小设置为尽可能大的值,同时确保为服务器上的其他进程留有足够的内存,以避免过多的页面交换(paging)。缓冲池越大,InnoDB就更像是一个内存数据库,从磁盘读取一次数据,然后在后续读取从内存中访问数据。有关详细信息,请参阅"配置 InnoDB 缓冲池大小"。
  • 在具有足够内存的64位系统上,可以将缓冲池分成多个部分,以最大程度地减少并发操作之间对内存结构的争用。有关详细信息,请参阅"配置多个缓冲池实例"。
  • 您可以将频繁访问的数据保留在内存中,而不受会将大量不经常访问的数据带入缓冲池的操作突然活动的影响。有关详细信息,请参阅"使缓冲池具有扫描抵抗力"。
  • 您可以控制何时以及如何执行预读请求,以异步方式将页面预取到缓冲池中,从而期望这些页面很快会被使用。有关详细信息,请参阅"配置 InnoDB 缓冲池预取(预读)"。
  • 您可以控制何时进行后台刷新,以及是否根据工作负载动态调整刷新速率。有关详细信息,请参阅"配置缓冲池刷新"。
  • 您可以配置InnoDB保存当前的缓冲池状态的方式,以避免服务器重新启动后的漫长预热时间。有关详细信息,请参阅"保存和恢复缓冲池状态"。

使用 InnoDB 标准监视器监控缓冲池

可以使用SHOW ENGINE INNODB STATUS访问InnoDB标准监视器输出提供的有关缓冲池操作的指标。缓冲池指标位于InnoDB标准监视器输出的BUFFER POOL AND MEMORY部分:

----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 2198863872
Dictionary memory allocated 776332
Buffer pool size   131072
Free buffers       124908
Database pages     5720
Old database pages 2071
Modified db pages  910
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 4, not young 0
0.10 youngs/s, 0.00 non-youngs/s
Pages read 197, created 5523, written 5060
0.00 reads/s, 190.89 creates/s, 244.94 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not
0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read
ahead 0.00/s
LRU len: 5720, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

下表描述了InnoDB标准监视器报告的缓冲池指标。

注:InnoDB标准监视器输出中提供的每秒平均值是基于自上次打印InnoDB标准监视器输出以来经过的时间计算的。

InnoDB 缓冲池指标如下表所示:

Name Description
Total memory allocated 为缓冲池分配的总内存(以字节为单位)。
Dictionary memory allocated InnoDB数据字典分配的总内存(以字节为单位)。
Buffer pool size 分配给缓冲池的页面总大小。
Free buffers 缓冲池空闲列表的页面总大小。
Database pages 缓冲池 LRU 列表的页面总大小。
Old Database pages 缓冲池旧 LRU 子列表的页面总大小。
Modified db pages 当前在缓冲池中修改的页面数。
Pending reads 等待读入缓冲池的缓冲池页面数。
Pending writes LRU 从 LRU 列表底部等待写入缓冲池中旧脏页的数量。
Pending writes flush list 检查点期间要刷新的缓冲池页面数。
Pending writes single page 缓冲池中暂挂的独立页面写入数。
Pages made young 缓冲池 LRU 列表中变年轻的页面总数(移至“新”页面的子列表的开头)。
Pages made not young 缓冲池 LRU 列表中没有变年轻的页面总数(保留在“旧”页面子列表中没有年轻的页面)。
youngs/s 在缓冲池 LRU 列表中,平均每秒访问旧页面并使其变为年轻页面的次数。有关更多信息,请参阅此表格后面的注释。
non-youngs/s 在缓冲池 LRU 列表中,平均每秒访问旧页面并未导致页面变为年轻页面的次数。有关更多信息,请参阅此表格后面的注释。
Pages read 从缓冲池读取的页面总数。
Pages created 在缓冲池中创建的页面总数。
Pages written 从缓冲池写入的页面总数。
reads/s 平均每秒读取的缓冲池页面数。
creates/s 平均每秒创建的缓冲池页面数。
writes/s 平均每秒缓冲池页面写入数。
Buffer pool hit rate 从缓冲池读取的页面与从磁盘存储读取的页面之间的缓冲池页面命中率。
young-making rate 页面访问导致页面变为年轻页面的平均命中率。有关更多信息,请参阅此表格后面的注释。
not (young-making rate) 页面访问未使页面变年轻的平均命中率。有关更多信息,请参见此表格后面的注释。
Pages read ahead 平均每秒的预读操作次数。
Pages evicted without access 平均每秒从缓冲池中淘汰而被访问的页面数量。
Random read ahead 平均每秒随机预读操作次数。
LRU len 缓冲池 LRU 列表的页面总大小。
unzip_LRU len 缓冲池 unzip_LRU 列表的长度(以页面为单位)。
I/O sum 访问的缓冲池 LRU 列表页面总数。
I/O cur 当前间隔内访问的缓冲池 LRU 列表页面总数。
I/O unzip sum 已访问的缓冲池 unzip_LRU 列表页面的总数。
I/O unzip cur 当前时间间隔内已访问的缓冲池 unzip_LRU 列表页面的总数。

Notes

  • 年轻页面生成速率youngs/s指标仅适用于旧页面。它基于页面的访问次数而不是页面数计算。对于给定页面,可能会有多次访问,所有访问都会被计算在内。如果在没有进行大规模扫描的情况下youngs/s非常低,则可能需要减少延迟时间或增加用于旧子列表的缓冲池百分比。增加百分比会使旧子列表变大,因此需要更长的时间才能将该子列表中的页面移动到尾部,从而增加这些页面再次被访问并成为年轻页面的可能性。请参阅“使缓冲池抗扫描”。

  • 非年轻页面生成速率non-youngs/s指标仅适用于旧页面,它基于页面的访问次数而不是页面数计算。对于给定页面,可能会有多次访问,所有访问都会被计算在内。如果在执行大型表扫描(以及较高的youngs/s)时没有看到更高的非年轻页面生成速率值non-youngs/s,请增加延迟值。请参阅“使缓冲池抗扫描”。

  • 年轻页面生成率young-making考虑了所有缓冲池页面的访问,而不仅仅是旧子列表中页面的访问。年轻页面生成率young-making和非年轻页面生成率non-youngs/s通常不会累加到整体缓冲池命中率上。在旧子列表中的页面命中会导致页面移动到新子列表,但是新子列表中的页面命中只有当它们距离列表头部一定距离时才会移动到列表头部。

  • 非(年轻页面生成率)not (young-making rate)是指由于未达到由innodb_old_blocks_time定义的延迟时间,或由于新子列表中的页面命中未导致页面移动到头部,而导致页面访问未使页面变为年轻页面的平均命中率。此率考虑了所有缓冲池页面的访问,而不仅仅是旧子列表中页面的访问。

缓冲池服务器状态变量和INNODB_BUFFER_POOL_STATS表提供了许多与InnoDB Standard Monitor 输出中相同的缓冲池指标。有关更多信息,请参阅示例“查询INNODB_BUFFER_POOL_STATS table”。

注:原文来自 MySQL 5.7 官方文档,阅读 MySQL 中文文档时有些语句理解不顺畅,便结合中文文档使用 ChatGPT 进行了翻译,如有不正请指出。文章来源地址https://www.toymoban.com/news/detail-499189.html

到了这里,关于MySQL 存储引擎 InnoDB 内存结构之缓冲池的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL—MySQL的存储引擎之InnoDB

    存储引擎 说明 MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务 InnoDB 5.5版本后MySQL的默认数据库存储引擎,支持事务和行级锁,比MyISAM处理速度稍慢 ISAM MyISAM的前身,MySQL5.0以后不再默认安装 MRG_MyISAM 将多个表联合成一个表使用,在超大规模数据存储时很有用 Me

    2024年04月26日
    浏览(43)
  • 谈谈MySQL的InnoDB存储引擎

    大家好,我是易安! 今天我们谈一谈MySQL中InnoDB存储引擎。InnoDB存储引擎作为我们最常用到的存储引擎之一,充分熟悉它的的实现和运行原理,有助于我们更好地创建和维护数据库表。 InnoDB主要包括了内存池、后台线程以及存储文件。内存池又是由多个内存块组成的,主要包

    2024年02月03日
    浏览(43)
  • MySQL 的 InnoDB 存储引擎简介

    MySQL 是世界上最流行的开源关系型数据库管理系统之一,而其中的存储引擎则是其关键组成部分之一。InnoDB 存储引擎在 MySQL 中扮演了重要角色,提供了许多高级功能和性能优化,适用于各种应用程序和工作负载。本文将深入介绍 InnoDB 存储引擎的各个方面,以帮助您更好地理

    2024年02月08日
    浏览(49)
  • MySQL高级10-InnoDB引擎存储架构

    表空间(Tablespace):一个mysql实例,及一个数据库实例,可以对应多个表空间(ibd文件),用于存储记录,索引等数据。 段(Segment):分为数据段(Leaf node segment)、索引段(Non-leaf node segment)、回滚段(Rollback segment),InnoDB是索引组织表,数据段就是B+树的叶子节点(Leaf node segment),

    2024年02月08日
    浏览(46)
  • mysql--InnoDB存储引擎--架构和事务

    MySQL进阶篇 InnoDB 逻辑存储单元主层级关系图: 1、表空间 表空间是InnoDB存储引擎逻辑结构的最高层, 如果用户启用了参数 innodb_file_per_table(在 8.0版本中默认开启) ,则每张表都会有一个表空间(xxx.ibd),一个mysql实例可以对应多个表空间,用于存储记录、索引等数据。 2、段

    2024年02月14日
    浏览(48)
  • 【MYSQL】存储引擎MyISAM和InnoDB

    查看MySQL提供所有的存储引擎 mysql show engines; mysql常用引擎包括:MYISAM、Innodb、Memory、MERGE 1、MYISAM:全表锁,拥有较高的执行速度,不支持事务,不支持外键,并发性能差,占用空间相对较小,对事务完整性没有要求,以select、insert为主的应用基本上可以使用这引擎 2、Innod

    2024年01月18日
    浏览(43)
  • 【MySQL】 深入了解InnoDB存储引擎的限制

    目录 列数限制 索引数限制 InnoDB的行格式和索引限制 示例和注意事项 **页大小对索引键前缀长度的影响 **对全列索引键的限制 多列索引限制 行大小限制 InnoDB log限制 表空间大小限制 表数量限制 操作系统限制 文件大小和日志文件大小 文件层级限制 随着数据库技术的不断发

    2024年01月24日
    浏览(50)
  • MySQL之深入InnoDB存储引擎——Checkpoint机制

    由于页的操作首先都是在缓冲池中完成的,那么如果一条DML语句改变了页中的记录,那么此时页就是脏的,即缓冲池中页的版本要比磁盘的新。那么数据库需要将新版本的页刷新到磁盘。倘若每次一个页发生变化就刷新,那么开销会很大,若热点数据集中在某几个页中,那么

    2024年02月15日
    浏览(41)
  • MySQL存储引擎InnoDB和MyISAM的区别?

    InnoDB和MyISAM是MySQL数据库两种常见的存储引擎,它们在性能、事务支持等方面有一些重要的区别。以下是它们的一些主要区别: 事务支持: InnoDB: 支持事务,具有ACID(原子性、一致性、隔离性、持久性)特性,适用于需要事务支持的应用,如银行、电商等。 MyISAM: 不支持

    2024年02月03日
    浏览(52)
  • MySQL高级篇(存储引擎InnoDB、MyISAM、Memory)

    目录 1、存储引擎简介 1.1、查询建表语句,默认存储引擎:InnoDB 1.2、查看当前数据库支持的存储引擎 1.3、创建表,并指定存储引擎 2、 存储引擎-InnoDB介绍 2.1、存储引擎特点  3、MyISAM存储引擎  4、Memory存储引擎  5、InnoDB、MyISAM、Memory的区别  6、存储引擎的选择 介绍:In

    2024年04月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包