14.4.3.1 The InnoDB Buffer Pool
14.4.3.2 Configuring Multiple Buffer Pool Instances
14.4.3.3 Making the Buffer Pool Scan Resistant
14.4.3.4 Configuring InnoDB Buffer Pool Prefetching (Read-Ahead)
14.4.3.5 Configuring InnoDB Buffer Pool Flushing
14.4.3.6 Fine-tuning InnoDB Buffer Pool Flushing
14.4.3.7 Saving and Restoring the Buffer Pool State
14.4.3.8 Monitoring the Buffer Pool Using the InnoDB Standard Monitor 14.4.3.1 The InnoDB Buffer Pool InnoDB 保持一个存储区域被称为buffer pool 用它cache 数据和索引 在内存里。 了解InnoDB buffer pool的工作, 并利用它来保持频繁访问的数据在内存里, 是MySQL 优化的一个重要方面 你可以配置InnoDB buffer pool的多个方面来改善性能: 1.理想情况下, 你可以设置buffer pool的大小足够大,留给足够的空间给其他的进程来运行不需要过度的分 页。 buffer pool越大, InnoDB 看起来更像一个内存数据库, 从磁盘读取一次,从内存访问数据在随后的读取中。 Buffer pool size 是通过innodb_buffer_pool_size 选项配置 2.64位系统有更大的内存大小,你可以把buffer pool 分成多个部分,以尽量减少并发操作之间的内存结构的 争用。 3. 你可以把频繁访问的数据放在内存里 4.你可以控制何时和如何InnoDB 执行预读请求来获取pages 到buffer pool 异步的进行, 预计很快需要这些pages. 5. 你可以控制当后台进程刷新脏pages 发生,是否Innodb基于负载调整刷新速度。 6.你可以配置InnoDB 来保存当前buffer pool 状态来避免一个长时间的热身阶段 在服务器重启后。 InnoDB Buffer Pool LRU Algorithm InnoDB 管理buffer pool作为一个列表, 使用变化的LRU算法。 当room 需要增加新的页到pool, InnoDB 驱逐最少使用的pages 增加新的page 到列表的中间。 这个中间点插入策略对待列表作为两个子列表 在头部,一个新的pages 列表,是被经常访问的, 在尾部, 一个老的pages 子列表最很少访问的 这个算法 保持pages 是被大量的使用用于查询在新的sublist 老的sublist 包含很少使用的页, 这些页面会被驱逐 LRU 算法操作默认如下: 1.3/8 的buffer pool 是投入到了old sublist 2.列表的中间点 是新的子列表的尾部遇到了 老的子列表的头部 3. 当InnoDB 读取 一个page 到buffer pool, 它初始插入到中间点( 老列表的头部). 一个页面可以被读取是因为它是需要的对于用户指定的操作 比如一个SQL查询,或者 预读操作的一部分 4. 访问一个old 子列表里的page 让这个page 变得年轻, 移动到buffer pool的头部(new sublist 的头部) 如果页面被读进因为它是需要的,第一次访问立即需要,page变的年轻。 如果page 由于预读被读取,第一次访问不发生 5. 在数据库操作时, buffer pool中的pages 是没有被访问 "age" 移动到列表的尾端。 pages 在新的和old 子列表页 其它pages 变为新的。 pages 在old sublist 也会变老当pages 被插入到中间段。 最终,一个page 仍旧不被使用足够长的时候会移动到 old sublist的尾部,被驱逐。 默认的,被查询读取的pages 立即移动到new sublist, 这意味着它们仍旧会停留在buffer pool很长一段时间 。 一个表扫描(
比如 执行一个mysqldump 操作或者一个SELECT 语句没有带WHERE条件) 可能会带来大量的数据到buffer pool,驱逐同等数量的老的数据, 即使新的数据不会再被使用。 类似的, 通过预读加载的pages,只被访问一次移动到 new list的头部。 这些情况可以把平凡使用的页面移动到old sublist,在那里它们收到驱逐。 InnoDB 标准监控输出包含几个字段在BUFFER POOL和MEMORY 章节 ,有关 buffer pool的操作 LRU算法。 InnoDB Buffer Pool 配置选项: InnoDB Buffer Pool Configuration Options 配置选项: 几个配置选项影响InnoDB buffer pool的不同方面: innodb_buffer_pool_size 指定buffer pool的大小, 如果buffer pool 是很小的,你有足够的内存, 让Buffer pool足够大能改善性能通过降低磁盘的I/O innodb_buffer_pool_instances 将缓冲池发成到用户指定的单独的区域的数量, 每个都有它自己的LRU list 和相关的数据结构, 减少竞争在并发的内存读取和写操作。 这个选项只有当 innodb_buffer_pool_size 设置1GB以上才有效。 你指定的总的大小是被划分到素有的buffer pools.为了最好的效率, 指定一个innodb_buffer_pool_instances and innodb_buffer_pool_size 的组合 每个buffer pool instance 至少1GB mysql> show variables like '%innodb_buffer_pool_instances%';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| innodb_buffer_pool_instances | 8 |
+------------------------------+-------+
1 row in set (0.00 sec) mysql> show variables like '%innodb_buffer_pool_size%';
+-------------------------+------------+
| Variable_name | Value |
+-------------------------+------------+
| innodb_buffer_pool_size | 8589934592 |
+-------------------------+------------+
1 row in set (0.00 sec) innodb_old_blocks_pct 指定buffer pool 大概的比例,InnoDB 用于old block sublist. 值的范围是5到95,默认是只37(也就是3/8) 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 立即移动到一个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) 如果值大于0, pages停留在old sublist 知道一个访问发生至少很多毫秒在首次访问后。 比如 值为1000 会导致pages 停留在old sublist 1秒钟 在首次访问 在它们成为合格的移动到new sublist 设置innodb_old_blocks_time 大于0 防止一次性表扫描充满new sublist 用用于扫描的页。 在pages里的行读进来被访问很多次 快速替代, 但是页不会被使用。如果innodb_old_blocks_time 是这位一个值大于0 那么时间来处理page, page 停留在old sublist 老化到list 的尾部 被快速淘汰。 这样, 页只被使用一次扫描 不损坏大量的使用的页面 在new sublist innodb_old_blocks_time 可以设置运行时间,因此你可以临时改变它当处理扫描和dump这些操作: SET GLOBAL innodb_old_blocks_time = 1000;
... perform queries that scan tables ...
SET GLOBAL innodb_old_blocks_time = 0; 这个侧路不应用如果你打算 "warm up" buffer pool 通过使用表的内存填充。 比如,基准测试经常执行一个表或者Index scan 在启动的时候, 因为 数据通常在buffer pool 在正常使用一段时间后,在那种情况下, 设置 innodb_old_blocks_time为0, 至少在热身阶段完成 innodb_read_ahead_threshold 控制线性预读,InnoDB 使用预取页面到buffer pool innodb_random_read_ahead 将随机的预读即使用于获取页面到buffer pool. 随机预读是一种即使预测页什么时候可能需要基于页面已经在buffer pool里, 忽略页面被读取的顺序。innodb_random_read_ahead 默认被关闭 innodb_adaptive_flushing 指定是否动态跳转刷新脏页的速录在buffer pool 中基于工作负载。 动态调整刷新速率 是为了避免突发的I/O活动,默认启用 innodb_adaptive_flushing_lwm redo log 容量的 low water mark 比例 在自适应刷新被启用:

14.4.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.6.3.1 The InnoDB Buffer Pool

    14.6.3.1 The InnoDB Buffer Pool InnoDB 保持一个存储区域被称为buffer pool 用于cache数据和索引在内存里, 知道InnoDB buffer pool ...

  4. 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 ...

  5. 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 脏 ...

  6. 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 ...

  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. c++ 静态成员遇到的坑总结

    新标签页http://74.55.154.136/ c++ 静态成员遇到的坑总结 - linuxfloat - 博客园 c++ 静态成员遇到的坑总结   1.对于类静态变量的初始化,用下面方法. // ...

  2. C#中ref参数及out参数对比

    ref 关键字和out关键字均会导致参数通过引用来传递(相同点1).这是两者的共同点. 通过引用传递参数,会使方法中对参数所做的任何修改都将反映在该变量中. 两者还有一个共同点,那就是:若要使用 re ...

  3. XSS学习笔记(四)-漏洞利用全过程

    <script type="text/javascript" reload="1">setTimeout("window.location ...

  4. PHP - 类库

    常用的PHP类库,PHP开发者必备[转] PHP开发者常用的PHP类库和组件 PDF 生成器 FPDF - 这量一个可以让你生成PDF的纯PHP类库. Excel 相关 你的站点需要生成Excel?没 ...

  5. MSSQL - 备份和还原数据库

    SQL语句备份和还原数据库:http://blog.csdn.net/liuhelong/article/details/3335687 1.MSSQL - SqlServer:此数据库处于单用户模式 ...

  6. sql: sql developer tunnel转接

    Use putty tunnel instead of login terminal server 有时候本地直接ping不通sql 的server, 但另一个server能连上,这时就可以把端口和i ...

  7. cocos2dx 在windows上实现键盘输入

    cocos2d主要面向的是触摸屏幕设备的,在WINDOWS下的定位感觉多多少少就是相当于一个模拟器,因此并没有太多的PC下重要的键盘支持.然而响应键盘消息对于调试来说可以提供不少方便.下边就通过更改c ...

  8. React.js学习

    React.js学习之环境搭建 1 工欲善其事必先利其器:前端开发工具 1.1 WebStorm和Sublime Text Sublime Text:作为代码编辑器,Sublime Text的优点如下 ...

  9. 《WCF技术剖析》博文系列汇总[持续更新中]

    原文:<WCF技术剖析>博文系列汇总[持续更新中] 近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析(卷1)>的写作,一直无暇管理自己的Blog.在<WCF技术剖 ...

  10. perl use utf8

    utf8 Perl编译 来启用/禁用 UTF-8(or UTF-EBCDIC) 在源代码里 简洁: use utf8; no utf8; # Convert the internal represen ...