14.6.3.1 The InnoDB Buffer Pool

InnoDB 保持一个存储区域被称为buffer pool 用于cache数据和索引在内存里,

知道InnoDB buffer pool 如何工作,利用它来保持频繁访问的数据在内存里,

是MYSQL 调优的一个重要方面。

你可以配置InnoDB buffer pool的各个方面来改善性能:

理想情况下,你设置buffer pool的大小为实际最大值,

留下足够的内存用于其他进程在服务器上运行而没有产生分页。

buffer pool越大, InnoDB 表位越像是内存数据库,从磁盘读取一次然后从内存访问数据在随后的读操作。

Buffer pool size  是使用 innodb_buffer_pool_size 配置选项

2.  随着64位系统使用大的内存,你可以把buffer 分成多个部分,

以尽量减少内存结果的冲突在并发操作期间。

3.你可以保持频繁访问的数据在内存里 尽管突然的高峰活动对于备份或者报告操作

4.你可以控制何时如何InnoDB 执行鱼肚请求来预获取Pages异步到buffer pool,

预计 pages 马上被需要

5. 你可以控制当background刷新旧的pages发生,是否InnoDB 动态调整 基于负载的刷新频率。

6.你可以配置InnoDB 来保持当前的buffer pool 状态来避免一个漫长的准备期在一个server 重启后。

你也可以保留当前的buffer pool 状态 当server 在运行时

InnoDB Buffer Pool LRU Algorithm

InnoDB 管理buffer pool 作为一个列表,使用一个变化的LRU算法。

当room 是被需要增加一个新的page 到pool,InnoDB 驱逐最少使用的pages增加新的pages到列表的中间。

这个 中间插入的策略 对待列表作为两个清单

1.在头部,  新的(或者年轻的)的一个子列表 被频繁访问

2.在尾部, 一个老的pages 的一个子列表很少被访问

这个算法保持pages  大量使用通过查询在新的子列表

老的子列表包含更少使用的页, 这些是候选为被驱逐

LRU 算法操作默认如下:

1.buffer pool的3/8 是分给old sublist

2. 列表的中间是边界新的sublist的尾部和 old sublist的开头

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

一个page 可以读进来 因为它是被需要用于一个用户指定的操作比如SQL查询,或者 作为预读的一部分被InnoDB自动执行

4.访问一个page 在old sublist 让这个Page变的年轻,移动到 buffer pool的head(new sublist的头部)

如果page 因为需要被读取, 第一次访问立即发生 page变的yong.

如果page 被读进来由于预读, 第一访问不立即发生

5.在进行数据库操作时, pages在buffer pool不被访问 变老移动到列表的尾部。

Pages 在new和old 子列表 老化其他pages变成新的。

6.默认的, pages被查询读取立即移动到new sublist,意味着他们会在buffer pool中停留很长时间。

一个表扫描(比如执行一个mysqldump操作),或者一个SELECT 语句没有带WHERE条件)

可以带来大量的数据到buffer pool ,驱逐等量的older数据,即使新的数据不会被再次使用。

类似的,pages是通过后台线程加载的 只访问一次 移动到new list的head.

这些情况回把平凡使用的pages移动到old sublist.

InnoDB Buffer Pool Configuration Options  InnoDB Buffer Pool 配置选项

几个配置选项影响InnoDB buffer pool的不同方面:

1.innodb_buffer_pool_size

指定buffer pool的大小, 如果buffer pool是太小了你有足够的内存,让buffer pool变大能改善性能

通过降低磁盘I/O的总量

zabbix:/root/Esx# cat /etc/my.cnf  | grep innodb_buffer_pool_size
innodb_buffer_pool_size=4G 2.innodb_buffer_pool_instances 把buffer pool 分成一个用户指定的单独的区域, 每个有它自己的LRU list和相关的数据结构, 降低竞争在并发内存读取和写操作。 这个选项只有当innodb_buffer_pool_size 值大于1GB才生效。 总的buffer pool的代销是被分成多个buffer pool. 为了最好的性能, 指定innodb_buffer_pool_instances and innodb_buffer_pool_size的组合 这样每个buffer pool 实例有至少1GB mysql> show variables like '%innodb_buffer_pool%';
+-------------------------------------+----------------+
| Variable_name | Value |
+-------------------------------------+----------------+
| innodb_buffer_pool_dump_at_shutdown | OFF |
| innodb_buffer_pool_dump_now | OFF |
| innodb_buffer_pool_filename | ib_buffer_pool |
| innodb_buffer_pool_instances | 8 |
| innodb_buffer_pool_load_abort | OFF |
| innodb_buffer_pool_load_at_startup | OFF |
| innodb_buffer_pool_load_now | OFF |
| innodb_buffer_pool_size | 4294967296 |
+-------------------------------------+----------------+
8 rows in set (0.01 sec) innodb_old_blocks_pct; 指定 buffer pool近似的比例 InnoDB 使用old block sublist. 范围是从5到95,默认是37(3/8的pool大小) mysql> show variables like '%innodb_old_blocks_pct%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_old_blocks_pct | 37 |
+-----------------------+-------+
1 row in set (0.00 sec) innodb_old_blocks_time: 指定多久单位毫秒一个page 插入到old sublist 必须留在那个在他第一次访问后在他可以被移动到new sublist 如果值是0, 一个page 插入到old sublist 立即移动到新的sublist 当它第一次被访问后。 如果值大于0, pages 停留在old sublist 知道一个访问发生至少多少毫秒后第一次被访问。 比如,值为1000 导致pages停留在old sublist 1秒钟 在首次访问后 在它们变的合格移动到new sublist mysql> show variables like '%innodb_old_blocks_time%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| innodb_old_blocks_time | 1000 |
+------------------------+-------+
1 row in set (0.00 sec) 设置 innodb_old_blocks_time 大于0防止一次表扫描充满new sublist 记录在一个Page读进来后一个扫描可以访问很多次,但是page是不能使用在那以后。 如果 innodb_old_blocks_time 是设置一个值大于处理page的时间, page停留在old sublist,老化到列表的尾部 被快速淘汰。 这种方式, pages只使用一次扫描不影响大量使用的pages在new sublist innodb_old_blocks_time 可以设置在运行时间,这样你可以临时改变 当操作需要表扫描或者dumps innodb_read_ahead_threshold 控制 预读的灵敏度,InnoDB 使用预取pages到buffer pool innodb_random_read_ahead 让随机的预读技术用于预取pages到buffer pool. mysql> show variables like '%innodb_random_read_ahead%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_random_read_ahead | OFF |
+--------------------------+-------+
1 row in set (0.00 sec) innodb_adaptive_flushing

14.6.3.1 The InnoDB Buffer Pool的更多相关文章

  1. 14.6.3.5 Configuring InnoDB Buffer Pool Flushing

    14.6.3.5 Configuring InnoDB Buffer Pool Flushing InnoDB 执行某些任务在后台, 包括脏叶的刷新(那些已经发生改变的pages 但是没有写入到数据文 ...

  2. 14.6.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead) 配置InnoDB Buffer pool 预取

    14.6.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead) 配置InnoDB Buffer pool 预取 一个预读请求是一个I/ ...

  3. 14.4.3.6 Fine-tuning InnoDB Buffer Pool Flushing 微调 InnoDB Buffer Pool 刷新:

    14.4.3.6 Fine-tuning InnoDB Buffer Pool Flushing 微调 InnoDB Buffer Pool 刷新: innodb_flush_neighbors an ...

  4. 14.4.3.5 Configuring InnoDB Buffer Pool Flushing 配置InnoDB Buffer Pool 刷新:

    14.4.3.5 Configuring InnoDB Buffer Pool Flushing 配置InnoDB Buffer Pool 刷新: InnoDB执行某些任务在后台, 包括flush 脏 ...

  5. 14.4.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead) 配置InnoDB Buffer pool 预读

    14.4.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead) 配置InnoDB Buffer pool 预读 一个预读请求 是一个I ...

  6. 14.4.3.1 The InnoDB Buffer Pool

    14.4.3.1 The InnoDB Buffer Pool 14.4.3.2 Configuring Multiple Buffer Pool Instances 14.4.3.3 Making ...

  7. 14.6.3.3 Making the Buffer Pool Scan Resistant

    14.6.3.3 Making the Buffer Pool Scan Resistant 相比使用一个严格的LRU算法,InnoDB 使用一个技术来最小化数据总量 带入到buffer pool 而 ...

  8. 14.6.3.2 Configuring Multiple Buffer Pool Instances 配置多个Buffer Poll 实例:

    14.6.3.2 Configuring Multiple Buffer Pool Instances 配置多个Buffer Poll 实例: 对于系统有多个buffer pools 在多个字节范围, ...

  9. 14.4.3.3 Making the Buffer Pool Scan Resistant

    14.4.3.3 Making the Buffer Pool Scan Resistant 让Buffer Pool 扫描 相比使用一个严格的LRU算法, InnoDB 使用一个技术来最小化数据的总 ...

随机推荐

  1. Android(java)学习笔记186:对ListView等列表组件中数据进行增、删、改操作

    1.ListView介绍 解决大量的相似的数据显示问题 采用了MVC模式: M: model (数据模型) V:  view  (显示的视图) C: controller 控制器 入门案例: acit ...

  2. Linux如何卸载挂载文件

    在我们进行远程文件操作的时候,我们经常会出现文件服务出现卸载掉哦情况.例如 umount /mnt/net1umount: /mnt/net1: device is busy.        (In ...

  3. 【原创教程】鲸吞HTML

    首先,我们的angularJS课程分为三大模块: HTML/CSS/JS基础. angularJS详解. angualrJS的一些实用框架讲解. 其中,第一大模块的对象是对前端开发技术有点了解但不熟悉 ...

  4. sql中对查询出来的数据进行分页

    当sql中存储的数据量比较大时,在web中 数据显示时都会对数据进行分页,分页不会在客户端进行分页,而是在数据库查询过程中进行了分页. sql代码: DECLARE @pageindex INT; - ...

  5. mht文件无法打开的解决办法

    对于喜欢上网的人士来说,经常会将自己看到的好的文章保存下来,以便日后再次翻阅,保存方法有两种:一种是通过浏览器的收藏夹进行收藏,这种方式适合于能够一直上网的电脑:另一种是通过浏览器“文件->另存 ...

  6. 计算机网络-ip地址聚合后可用的地址数

    (1)59.81.1.128/28=59.81.1.1000-0000(2)59.81.1.144/28=59.81.1.1001-0000(3)59.81.1.160/28=59.81.1.1010 ...

  7. Android工程师必会做的20道题

    一.单选题     (共7道题,每题5分) 1.使用AIDL完成远程service方法调用下列说法不正确的是 A.aidl对应的接口名称不能与aidl文件名相同 B.aidl的文件的内容类似java代 ...

  8. SQL SERVER while循环

    在SQL数据库中,可以通过WHILE实现循环,下面就将为您介绍SQL循环执行while控制,希望对您提升WHILE的使用水平能够有些帮助. WHILE Boolean_expression    { ...

  9. python隐含的特性

    本文源自(http://stackoverflow.com/questions/101268/hidden-features-of-python)希望介绍Python非常有用,而比较忽视的Python ...

  10. 利用XPath解析带有xmlns的XML文件

    在.net中,编写读取xml 的程序中提示"未将对象引用设置到对象的实例",当时一看觉得有点奇怪.为什么在读取xml数据的时候也要实例化一个对象.google了才知道,xml文件中 ...