广州建站模板,汕头网站建设推广费用,北京的招聘网站有哪些,百度竞价托管费用The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引#xff0c;知道innodb bufferpool怎么工作#xff0c;和利用它读取频繁访问的数据#xff0c;是mysql优化重要的方面。 理想状况下#xff0c;把bufferpool的大小调整到足够大…The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引知道innodb bufferpool怎么工作和利用它读取频繁访问的数据是mysql优化重要的方面。 理想状况下把bufferpool的大小调整到足够大留下足够的内存空间给其他该服务器上的进程使其无缺页即可。bufferpool越大innodb 月表现为内存型数据库从硬盘上一次读取数据之后并成了从内存中读取数据。buffer pool甚至缓存那些因为insert,update操作而改变的数据insert buffer所以随机磁盘写可以聚集在一块得到更好的性能。 innodb 把缓存池作为链式管理利用LRUleast 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将成为替换或驱逐的候选者。 13/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算法 1innodb 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_castlonglong(srv_buf_pool_def_size),static_castlonglong(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 : 分成多个独立的区域各个区域相同来减少在并发内存读写操作的竞争 3innodb old blocks pct:默认3/8; 4: innodb old blocks time: 指定多长时间以毫秒为单位(ms),block插入到老子列表必须呆在那里第一次访问后多久,才能搬到新的子列表解决预读时缓存污染问题