The InnoDB Buffer Pool

Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb bufferpool怎么工作,和利用它读取频繁访问的数据,是mysql优化重要的方面。

理想状况下,把bufferpool的大小调整到足够大,留下足够的内存空间给其他该服务器上的进程(使其无缺页即可)。bufferpool越大,innodb 月表现为内存型数据库,从硬盘上一次读取数据,之后并成了从内存中读取数据。buffer pool甚至缓存那些因为insert,update操作而改变的数据(insert buffer),所以随机磁盘写可以聚集在一块得到更好的性能。

innodb 把缓存池作为链式管理,利用LRU(least recently used)算法,当添加新block到pool中时(无空间),innodb 替换(驱逐)一个最近最少使用的block,然后把新的block添加到链表的中间,"midpoint insertion strategy"策略把链表看出两条子链。

1:在链表的头部,是由一些“NEW”(or "young")block 组成的最近刚被访问的子链;

2:在链表的尾部,是由一些'old' block组成的最近没被访问(或者最少被访问的)的子链;

 该算法使大量查询 blocks 保持在  new sublist. old sublist 持有最少使用的 blocks;这些blocks将成为替换或驱逐的候选者。

1:3/8 的buffer pool 的大小分配给old sublist

2: 链表的 midpoint (中间插入点) 是new sublist 尾部和 old sublist头部聚合的地方

3:当 innodb 读取一个block进 buffer pool时,插入到midpoint(old sublist 的头部),block被读取发生在 客户端操作,eg: sql查询,或者innodb特性 readahead(预读);

4:当访问在old sublist中一个 block时,使其变成'young',把它移动到 buffer pool的头部(new sublist的头部),如果该block 被读取是因为客户端sql查询,则第一次访问立即发生,并且该block变成'young'。如果该block被读取是因为read ahead,第一次呗访问不会发生,并且有可能在该Block被替换之前根本不能发生);

5:随着数据库操作,在buffer pool 中的没被访问的blocks(年纪大的)被移动到链表的尾部.在old sublist中的blocks 比插入在midpoint上的block老,最终,一个Block一段长时间未被使用会到达old sublist的尾部会被替换。

默认情况下,被读取的blocks会立即移动到 NEW sublist 的 head,同时意味着他们待着buffer pool中很长一段时间。当扫表时(eg, mysqldump 操作,或者 没有where语句的select操作 )可以使大量的blocks  push into buffer pool中,并且驱逐大量的older 数据,即使那些所谓刚加入的 new blocks 不会再次被访问,相同的,read ahead 后台线程一次载入大量的blocks  ,这些情况使经常被访问的blocks push into 到 old sublist中,然后它们成为被驱逐的候选者。

一些innodb 系统变量控制着buffer pool的大小和使你调整LRU算法

1:innodb buffer pool size

指明Buffer pool的大小,如果你的buffer pool 空间小,并且有充足的空间,使pool大点可以减小磁盘IO的次数来提高性能;

/* If the default value of innodb_buffer_pool_size is increased to be more than
BUF_POOL_SIZE_THRESHOLD (srv/srv0start.cc), then srv_buf_pool_instances_default
can be removed and 8 used instead. The problem with the current setup is that
with 128MiB default buffer pool size and 8 instances by default we would emit
a warning when no options are specified. */
// 128MiB / 8 = 16KB
static MYSQL_SYSVAR_LONGLONG(buffer_pool_size, srv_buf_pool_curr_size,PLUGIN_VAR_RQCMDARG |PLUGIN_VAR_PERSIST_AS_READ_ONLY,"The size of the memory buffer InnoDB uses to ""cache data and indexes of its tables.",NULL, innodb_buffer_pool_size_update,static_cast<longlong>(srv_buf_pool_def_size),static_cast<longlong>(srv_buf_pool_min_size),longlong{srv_buf_pool_max_size}, 1024 * 1024L);

innodb_buffer_pool_size的大小默认是128MB,分为8个instance,每个instance是16KB,并且对数据的操作是按页进行读写的,一页就是16KB。

buffer_pool是一个list,目的是为了使用LRU cache机制;减少并发写操作时锁的粒度。

2: innodb buffer pool instances : 分成多个独立的区域,各个区域相同,来减少在并发内存读写操作的竞争;

3:innodb old blocks pct:默认3/8;

4:  innodb old blocks time: 指定多长时间以毫秒为单位(ms),block插入到老子列表必须呆在那里第一次访问后多久,才能搬到新的子列表(解决预读时,缓存污染问题);

mysql innodb缓存策略之Buffer Pool相关推荐

  1. mysql innodb 缓存设置_数据库分享一: MySQL的Innodb缓存相关优化

    无论是对于哪一种数据库来说,缓存技术都是提高数据库性能的关键技术,物理磁盘的访问速度永 远都会与内存的访问速度永远都不是一个数量级的.通过缓存技术无论是在读还是写方面都可以大大提 高数据库整体性能. ...

  2. MySQL 5.6 dump/load buffer pool实验

    Using MySQL Preloading Buffer Pool for fast restart. 什么场景下,会使用该功能. 当你的数据库系统较大,比如有128G物理内存,那么对应的buffe ...

  3. MySQL 引擎特性 · InnoDB Buffer Pool

    前言 用户对数据库的最基本要求就是能高效的读取和存储数据,但是读写数据都涉及到与低速的设备交互,为了弥补两者之间的速度差异,所有数据库都有缓存池,用来管理相应的数据页,提高数据库的效率,当然也因为引入 ...

  4. MySQL怎么运行的系列(二)Innodb缓冲池 buffer pool 和 改良版LRU算法

    本系列文章目录 展开/收起 MySQL怎么运行的系列(一)mysql体系结构和存储引擎 MySQL怎么运行的系列(二)Innodb缓冲池 buffer pool 和 改良版LRU算法 MySQL怎么运 ...

  5. mysql pool返回值_Mysql成神之路-InnoDB 的 Buffer Pool

    缓存的重要性 我们只需要访问一个页的一条记录,那也需要先把整个页的数据加载到内存中.将整个页加载到内存中后就可以进行读写访问了,在进行完读写访问之后并不着急把该页对应的内存空间释放掉,而是将其缓存起来 ...

  6. MySQL - InnoDB特性 - Buffer Pool漫谈

    转载自  MySQL - InnoDB特性 - Buffer Pool漫谈 缓存管理是DBMS的核心系统,用于管理数据页的访问.刷脏和驱逐:虽然操作系统本身有page cache,但那不是专门为数据库 ...

  7. mysql fsync_MySQL - InnoDB特性 - Buffer Pool漫谈

    缓存管理是DBMS的核心系统,用于管理数据页的访问.刷脏和驱逐:虽然操作系统本身有page cache,但那不是专门为数据库设计的,所以大多数数据库系统都是自己来管理缓存.由于几乎所有的数据页访问都涉 ...

  8. 重学MySQL(InnoDB Buffer Pool是什么?)

    文章目录 InnoDB Buffer Pool是什么? 我们的数据是如何放在InnoDB Buffer Pool中的? InnoDB怎么知道数据页是否在Buffer Pool中? InnoDB Buf ...

  9. mysql的缓冲池大小_配置InnoDB缓冲池(Buffer Pool)大小

    1.配置InnoDB缓冲池(Buffer Pool)大小 当服务器正运行时,用户可以离线(启动时)或在线配置InnoDB缓冲池大小.这部分描述的行为适用这两种方法. 当增加或减少innodb_buff ...

最新文章

  1. 树莓派避障小车(python)
  2. PLSQL连Oracle数据库Could not load ……\bin\oci.dll
  3. 每天首次登陆记录设备信息
  4. LeetCode算法题1:判断整数数组是否存在重复元素
  5. VTK:KDTree时序用法实战
  6. C# 使用WinApi操作剪切板Clipboard
  7. 警告用户:VoIP电话存在诸多风险
  8. 【演化计算】【论文研读】Completely Automated CNN Architecture Design Based on Blocks
  9. 用create table 命令建立表
  10. 小狸智能原创工具·AI伪原创API工具
  11. android友盟错误统计,Android—友盟统计收集错误和在线统计
  12. Linux系统下LightDM详解
  13. OpenCV图像处理基础(C++版)
  14. ae表达式修复_AE中常见表达式错误修改解决方法
  15. 华为IPsec实现支部与支部间借助总部进行隧道中转
  16. openresty 支持php,从零搭建php环境-openresty
  17. 高校教材管理系统mysql_高校教材管理系统的设计与实现(PHP,MySQL)(含录像)
  18. 《虚拟化安全解决方案》一1.2 虚拟环境的威胁
  19. PSIM软件的数字控制官方例程
  20. linux ipproto_ip 头文件,TCP-IP-NetworkNote

热门文章

  1. 学习笔记(11月08日)--异常
  2. 匿名包装器(function(){})()
  3. 一个10年SEO工作者的35个SEO经验
  4. Hibernate实体JSONObject化时遇到的问题
  5. 安装SQL2005只有配置工具或 错误码是29506 解决方案
  6. 无论是cisco还是华三的书上对于子网划分有个问题需要解释
  7. 【修炼5】《基础篇》别把项目成功当目标
  8. 超全Typora快速入门
  9. Centos7更新 SQLite3至版本3.29.0
  10. rhel mysql安装_RHEL6.4下MySQL安装方法及简单配置