1.InnoDB缓冲池(The InnoDB Buffer Pool)
InnoDB维护一个在内存中缓存数据和索引缓冲池存储区域,64位操作系统可以容纳大量内存,能将缓存池分裂为多个。详见14.2.4.2.27,
“Improvements to Performance from Multiple Buffer Pools”.
内部介绍
InnoDB使用一个列表管理池,使用最近最少使用(LRU)算法。
这种“中点插入战略”将列表作为两个列表:
-
头部表,存储最近使用的表。
-
尾部表,存储最近没有使用的表。
LRU算法的操作如下默认:
-
3 / 8的缓冲池是用于老的子表。
-
列表的中间点是新表列的尾部和老表列的头部。
-
当InnoDB 读到一块缓冲池,它最初将其在中点。一个块可以阅读因为它时用户指定的操作如SQL查询所需的,或作为InnoDB一个提前读操作的自动执行部分。
-
访问一块旧表会使其“young”,并移动它到buffer pool的头部。如果块被读出时因为它被需要。
-
作为数据库操作,块在缓冲池中不被访问时走向列表的尾部。
配置选项
InnoDB的一些系统变量控制缓冲池的大小调整LRU算法:
-
innodb_buffer_pool_size
指定的缓冲池的大小。如果有足够的内存但缓冲池太小,创建大池可以通过减少磁盘I / O所需的查询访问InnoDB表的数量来提高性能。
-
innodb_buffer_pool_instances
将缓冲池划分到用户指定的独立的区域号码,每一个都有自己的LRU列表和相关的数据结构,为了减少内存争用期间并发读写操作。只有当innodb_buffer_pool_size设置为1GB或更多时此选项才起作用。指定的大小将划分所有缓存。最佳效果是innodb_buffer_pool_instances和innodb_buffer_pool_size划分的每一个buffer pool实例最少为1G.
-
innodb_old_blocks_pct
指定的InnoDB使用旧块列表在缓冲池百分比的百分比。该值范围是5~95,。默认为37(that is, 3/8 of the pool)。
-
innodb_old_blocks_time
指定一个毫秒值,该值控制老表被访问后需要多久才能移动到新表列。该值默认为0,。
innodb_old_blocks_time 可以在运行时设置,所以可以改变它以应对暂时执行的操作如表扫描和转储:
SET GLOBAL innodb_old_blocks_time = 1000;... perform queries that scan tables ...
SET GLOBAL innodb_old_blocks_time = 0;
Monitoring the Buffer Pool(监控缓冲池)
从InnoDB的标准监控该输出包含在BUFFER POOL AND MEMORY部分,涉及到的缓冲池LRU算法的操作:
-
Old database pages:在缓冲池的旧子列表的页数。
-
Pages made young, not young:老页的数被转移到缓冲池的头部(新的子列表),并正在取得新的已残留在旧子列表而不页数。
-
youngs/s non-youngs/s:老的页面访问该已导致使它们年轻与否的数目。该指标不同于在两个方面上一个项目的。
-
young-making rate:命中这一事业的块移动到缓冲池的头部。
-
not:命中不会导致块移动到缓冲池的头部(由于延迟没有得到满足)。
young-making速度和not速度通常不会加起来的总缓冲池的命中率。
从monit或前面的信息可以帮助你做出LRU调整的决定:
-
如果你看到非常低的youngs/s值,当你没有大型扫描正在进行,这表明,你可能需要或者减少延迟时间,或增加用于旧子列表缓冲池的百分比。
-
如果你没有看到很non-youngs/s,当你正在做的大表扫描(和大量的的Youngs/s),来调整你的延迟值要大一些。
有关InnoDB的监控的更多信息,详见 Section 14.2.4.4, “SHOW ENGINE INNODB STATUS and the InnoDB Monitors”。
阅读(475) | 评论(0) | 转发(0) |