您的位置:首页 > Web前端

8.10.1 The InnoDB Buffer Pool

2015-11-02 15:05 309 查看
8.10 Buffering and Caching

8.10.1 The InnoDB Buffer Pool

8.10.2 The MyISAM Key Cache

8.10.3 The MySQL Query Cache

8.10.4 Caching of Prepared Statements and Stored Programs

MySQL 使用几种策略来cache信息到buffers 来提高性能:

8.10.1 The InnoDB Buffer Pool

InnoDB 维护一个存储区域叫做buffer pool 用于cache 数据和索引在内存里。

了解InnoDB buffer pool如何工作,并利用它来保持经常访问的数据在内存里,是MySQL 优化的一个重要的方面:

注意:

关于 InnoDB buffer pool 额外的信息 see Section 14.3.3, “InnoDB Buffer Pool Configuration”.

指南:

理想情况下,你设置buffer pool的大小足够大, 留足够的内存给其他进程 来运行 而不需要换页。

buffer pool越大,InnoDB 更表现像内存数据库, 从磁盘中读取数据一次,访问数据从内存读取

buffer pool甚至cache被insert和update操作改变的数据, 因此磁盘写能组合在一起 ,以更好的性能。

依赖你系统的典型的负载, 你可以需要调整buffer pool的部分比例。

你可以调整buffer pool 选择哪些block cahce一次 ,保持经常访问的数据在内存里。

在64位系统的大内存里,你可以 把buffer pool 分成多个部分, 以尽量减少并发操作之间的内存结构的争用。

内部细节:

InnoDB 管理pool 作为一个列表,使用一个变化的LRU算法那。 当room需要增加一个新的block 到一个池子里,

InnoDB 驱逐最少使用的块和增加新的块到list的中间

1.在头, 一个新的block列表是最近访问的

2.在尾部, 老的块的列表是最少访问的

该算法保证大量访问的块在新的sublist,老的sublist 包含很少使用的blocks。

The LRU algorithm operates as follows by default:LRU算法的操作如下默认:

LRU 算法的操作如下:

buffer 的3/8 是给老的sublist

列表的中间是边界 新的sublist 遇到老的sublist的头。

当InnoDB 读取一个block 到buffer pool, 它初始插入在中间( old sublist的头).

一个block 可以被读取 因为它是一个用户指定的操作, 比如SQL查询,或者是预读操作的一部分。

访问一个old sublist里的块 会让这个块年轻, 移动到buffer pool的head( the head of the new sublist)

如果block 块被读取, 第一次访问发生,block变的年轻。

如果块由于预读被读取,第一次访问不立即发生

当数据库操作时, 在buffer pool中的blocks 没有被访问 移动到列表的尾部。

Configuration Options 配置选项

几个InnoDB 系统变量控制buffer pool的size , 让你调整LRU算法:

1.innodb_buffer_pool_size

指定buffer pool的大小, 如果你的buffer pool 是小的,你有充足的内存,

使池子足够大可以提高性能 来降低disk I/O

2.innodb_buffer_pool_instances

将buffer pool 分配到用户指定的单独区域,每个有自己的LRU列表和相关的数据结构,

来降低竞争。

这个选项生效 当设置innodb_buffer_pool_size为1GB或者更大
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: