缓冲池是主存中的一个区域InnoDB
缓存被访问的表和索引数据。缓冲池允许经常使用的数据直接从内存中访问,这加快了处理速度。在专用服务器上,多达80%的物理内存通常分配给缓冲池。
为了提高大容量读操作的效率,缓冲池被划分为可能容纳多行的页。为了提高缓存管理的效率,缓冲池被实现为一个页链表;很少使用的数据将使用最近最少使用(LRU)算法的变体从缓存中老化。
了解如何利用缓冲池将频繁访问的数据保存在内存中是MySQL调优的一个重要方面。
使用LRU算法的变体将缓冲池作为列表进行管理。当需要空间向缓冲池添加新页时,最近使用最少的页将被清除,并将新页添加到列表中间。这个中点插入策略将列表视为两个子列表:
在头部,new (”年轻的”)最近访问过的网页
在尾部,是最近访问次数较少的旧页面的子列表
该算法将频繁使用的页面保留在新的子列表中。旧的子列表包含较少使用的页面;这些页面是候选页面驱逐.
缺省情况下,算法运行如下:
3/8的缓冲池用于旧的子列表。
列表的中点是新子列表的尾部与旧子列表的头部相遇的边界。
当
InnoDB
将一个页面读入缓冲池,它最初将其插入到中点(旧子列表的头部)。页面可以被读取,因为它是用户发起的操作(如SQL查询)所必需的,或者是数据库的一部分预读由InnoDB
.访问旧子列表中的页面会使”年轻的”,将其移动到新子列表的头部。如果读取该页是因为用户发起的操作需要它,则立即进行第一次访问,并将该页设为年轻页。如果由于预读操作而读取该页,则不会立即进行第一次访问,并且可能在该页被逐出之前根本不会进行第一次访问。
当数据库运行时,缓冲池中未被访问的页”年龄”通过移动到列表的尾部。新子列表和旧子列表中的页面都会随着其他页面的更新而老化。旧子列表中的页面也会随着页面在中点插入而老化。最终,一个未使用的页面到达旧子列表的尾部并被驱逐。
默认情况下,查询读取的页面立即移动到新的子列表中,这意味着它们在缓冲池中停留的时间更长。对象执行的表扫描, mysqldump操作或选择
带有no的语句在哪里
子句,例如,可以将大量数据带入缓冲池,并驱逐等量的旧数据,即使新数据永远不会再次使用。类似地,预读后台线程加载并只访问过一次的页面被移到新列表的头部。这些情况可以将经常使用的页面推到旧的子列表中,在那里它们将成为驱逐的对象。有关优化此行为的信息,请参见第15.8.3.3节,使缓冲池能够抵抗扫描,章节15.8.3.4,配置InnoDB缓冲池预取(预读取).
InnoDB
中的标准监视器输出包含几个字段缓冲池和内存
节中关于缓冲池LRU算法的操作。详细信息请参见使用InnoDB Standard Monitor监控缓冲池.
您可以配置缓冲池的各个方面以提高性能。
理想情况下,可以将缓冲池的大小设置为尽可能大的值,从而为服务器上的其他进程留下足够的内存,使它们能够在不进行过多分页的情况下运行。缓冲池越大,越多
InnoDB
类似于内存中的数据库,从磁盘读取一次数据,然后在后续读取时从内存访问数据。看到15.8.3.1节,配置InnoDB缓冲池大小.在具有足够内存的64位系统上,可以将缓冲池分割为多个部分,以最大限度地减少并发操作之间对内存结构的争用。详细信息请参见15.8.3.2节,“配置多个缓冲池实例”.
您可以将频繁访问的数据保存在内存中,而不考虑操作活动的突然尖峰(会将大量不频繁访问的数据带入缓冲池)。详细信息请参见第15.8.3.3节,使缓冲池能够抵抗扫描.
您可以控制如何以及何时执行预读请求,以异步将页面预取到缓冲池中,以预测即将需要这些页面。详细信息请参见章节15.8.3.4,配置InnoDB缓冲池预取(预读取).
您可以控制何时发生背景刷新,以及是否根据工作负载动态调整刷新速率。详细信息请参见第15.8.3.5节,“配置缓冲池刷新”.
你可以配置
InnoDB
保留当前缓冲池状态,以避免服务器重新启动后的长时间预热。详细信息请参见15.8.3.6节,保存和恢复缓冲池状态.
InnoDB
标准监视器输出,可以使用显示引擎innodb状态
,提供有关缓冲池操作的度量。缓冲池指标位于缓冲池和内存
的部分InnoDB
标准监视器输出:
----------------------缓冲池和内存----------------------已分配的大内存总数2198863872已分配的字典内存776332缓冲池大小131072空闲缓冲区124908数据库页5720旧数据库页2071修改的数据库页910暂挂读0暂挂写:LRU 0, flush列表0,单页0 page made young 4, not young 0 0.10 young /s, 0.00 non-young /s Pages read 197, created 5523, written 5060 0.00 reads/s, 190.89 created /s, 244.94 writes/s Buffer pool命中率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
最后一次打印标准监视器输出。
表15.2 InnoDB缓冲池指标
名字 | 描述 |
---|---|
已分配内存总量 | 分配给缓冲池的总内存(以字节为单位)。 |
已分配字典内存 | 对象分配的总内存InnoDB 以字节为单位的数据字典。 |
缓冲池大小 | 以页为单位分配给缓冲池的总大小。 |
免费的缓冲区 | 缓冲池空闲列表的总大小(以页为单位)。 |
数据库页面 | 缓冲池LRU列表的总大小,以页为单位。 |
旧的数据库页面 | 缓冲池旧LRU子列表的总大小(以页为单位)。 |
修改db页面 | 缓冲池中修改的当前页数。 |
等待读取 | 等待读入缓冲池的缓冲池页数。 |
挂起写入LRU | 缓冲池中要从LRU列表底部写入的旧脏页的数量。 |
挂起写入刷新列表 | 在检查点期间要刷新的缓冲池页数。 |
挂起写入单页 | 缓冲池中挂起的独立页写的数量。 |
书页变得年轻 | 的子列表头部的缓冲池LRU列表中年轻的页面总数”新”页)。 |
不再年轻的书页 | 缓冲池LRU列表中未设置为年轻的页的总数(保留在”老”子列表而不使年轻)。 |
扬斯/秒 | 缓冲池LRU列表中导致页面变年轻的旧页面的每秒平均访问次数。有关更多信息,请参阅本表后面的注释。 |
non-youngs /秒 | 缓冲池LRU列表中导致页面不再年轻的旧页面的每秒平均访问次数。有关更多信息,请参阅本表后面的注释。 |
页面读 | 从缓冲池读取的页总数。 |
创建页面 | 在缓冲池中创建的页总数。 |
页写 | 从缓冲池写入的总页数。 |
读取/秒 | 每秒平均读取缓冲池页面的次数。 |
创建/秒 | 每秒创建的缓冲池页面的平均数量。 |
写/秒 | 平均每秒写入缓冲池页面的次数。 |
缓冲池命中率 | 从缓冲池读取的页面与从磁盘存储读取的页面的缓冲池页面命中率。 |
young-making率 | 页面访问的平均命中率导致页面年轻。有关更多信息,请参阅本表后面的注释。 |
不是(年轻率) | 页面访问的平均命中率并没有导致页面年轻。有关更多信息,请参阅本表后面的注释。 |
提前读几页 | 每秒预读操作的平均值。 |
页面在没有访问权限的情况下被驱逐 | 未从缓冲池访问而被清除的页面的每秒平均值。 |
随机提前读 | 每秒随机预读操作的平均值。 |
LRU len | 缓冲池LRU列表的总大小,以页为单位。 |
unzip_LRU len | 缓冲池unzip_LRU列表的长度(以页为单位)。 |
I / O和 | 访问缓冲池LRU列表页的总数。 |
I / O坏蛋 | 当前时间间隔内访问缓冲池LRU列表页面的总数。 |
I/O解压缩和 | 解压的缓冲池unzip_LRU列表页的总数。 |
I/O解压缩狗 | 当前时间间隔内解压的缓冲池unzip_LRU列表页面总数。 |
笔记:
的
扬斯/秒
Metric仅适用于旧页面。它基于页面访问的数量。对于给定的页面可以有多次访问,所有的访问都被计算在内。如果你看到很低扬斯/秒
值时,考虑减少延迟时间或增加用于旧子列表的缓冲池的百分比。增加百分比会使旧子列表变大,因此该子列表中的页面移动到尾部需要更长的时间,这增加了再次访问这些页面并将其变为年轻页面的可能性。看到第15.8.3.3节,使缓冲池能够抵抗扫描.的
non-youngs /秒
Metric仅适用于旧页面。它基于页面访问的数量。对于给定的页面可以有多次访问,所有的访问都被计算在内。如果你没有看到更高的non-youngs /秒
值时执行大型表扫描(以及更高的扬斯/秒
Value),增加延迟值。看到第15.8.3.3节,使缓冲池能够抵抗扫描.的
young-making
Rate表示所有缓冲池页面访问,而不仅仅是旧子列表中的页面访问。的young-making
率和不
速率加起来通常不等于总的缓冲池命中率。旧子列表中的页面点击会导致页面移动到新子列表中,但新子列表中的页面点击会导致页面移动到列表的头部,前提是它们距离头部有一定距离。不是(年轻率)
由于定义的延迟,页面访问没有导致页面年轻的平均命中率是否innodb_old_blocks_time
没有被满足,或者由于新子列表中的页面点击没有导致页面被移动到头部。这个速率说明了所有缓冲池页面访问,而不仅仅是旧子列表中页面的访问。
缓冲池服务器状态变量和INNODB_BUFFER_POOL_STATS
表中提供了许多相同的缓冲池指标InnoDB
标准监视器输出。有关更多信息,请参见例15.10,“查询INNODB_BUFFER_POOL_STATS表”.