首页 > 系统相关 >innodb中内存管理机制BufferPool

innodb中内存管理机制BufferPool

时间:2022-11-21 13:34:05浏览次数:61  
标签:BufferPool 缓存 管理机制 链表 InnoDB MySQL innodb 数据


内存结构

innodb中内存管理机制BufferPool_缓存

 

InnoDB主索引是聚簇索引,索引与数据共用表空间,对于InnoDB而言,数据就是索引,索引就是数据。InnoDB缓存机制和MyISAM缓存机制的最大区别就是在于,InnoDB不仅仅是缓存索引,还会缓存数据。

InnoDB缓存池
InnoDB缓存池(InnoDB buffer pool)是InnoDB性能提升的核心,它既可以缓存数据还可以缓存索引,甚至其他管理数据(例如元数据信息,行级锁信息)。

查看InnoDB缓存池的相关参数信息


show variables like 'innodb%pool%'


innodb中内存管理机制BufferPool_数据_02

innodb_buffer_pool_size:用于设置InnoDB缓存池的大小。
InnoDB缓存池的大小对InnoDB整体性能影响较大,如果当前的MySQL服务器专门用于提供MySQL服务,应尽量增加InnoDB_buffer_pool_size的大小,把频繁访问的数据都放到内存中来,尽可能减少InnoDB对硬盘的访问。

在5.7.4 之前,如果想要更改 innodb_buffer_pool_size 的大小,只能 kill 掉进程才行,但是5.7.5开始,不需要停止进程就可以动态更改 innodb_buffer_pool_size 的大小。

 

innodb_buffer_pool_instances:默认值是1,表示InnoDB缓存池被划分到一个区域。适当地增加该参数(例如将该参数值设置为2),此时InnoDB被划分成为两个区域,可以提升InnoDB的并发性能。如果InnoDB缓存池被划分成多个区域,建议每个区域不小于1GB的空间。

innodb_additional_mem_pool_size:指定InnoDB用来存储数据字典和其他内部数据结构的缓存大小,默认值是2MB。InnoDB表的个数越多,该参数的值就应该设置得越大;当InnoDB用完缓存空间时,InnoDB就会操作系统申请内存空间,并向错误日志写入一条警告信息。

 

InnoDB缓存池内部结构

InnoDB在内存中维护一个缓存池用于缓存数据和索引。缓存池可以被认为一条长LRU链表,该链表又分为2个子链表,一个子链表存放old pages(里面存放的是长时间未被访问的数据页),另一个子链接存放new pages(里面存放的是最近被访问的数据页面)。其余为new pages占用,靠近LRU链表头部的数据页表示最近被访问,靠近LRU链表尾部的数据页表示长时间未被访问,而这两个部分交汇处成为midpoint。

innodb中内存管理机制BufferPool_数据_03


当用户需要访问数据时,InnoDB首先会在InnoDB缓冲池查找数据,如果缓冲池中没有数据时,InnoDB会将硬盘上的数据块插入到InnoDB缓存池中;如果InnoDB缓冲池已满,InnoDB通过LRU算法清除innoDB缓存池中个别数据块。每当有新数据块需要加载到InnoDB缓冲池中时,该数据块应变为‘数据页’被插到midpoint的位置,并声明为old数据页。那么old数据页什么时候能移动到new Page链表中呢?


(1)当InnoDB_old_blocks_time的参数值设置为0时。当old部分的数据页被访问到时,该数据页会被提升到链表的头部,并被标记为new数据页。

(2)当InnoDB_old_blocks_time的参数值大于0时(以1000毫秒或者1秒为例)。old部分数据页插入缓冲池后,1秒之后被访问,该数据页会被提升到链表的头部,并被标记为new数据页。在刚插入到一秒内,即便old部分的数据页被访问,该数据页也不会移动到new链表的头部。


查看InnoDB缓冲池结构的参数信息

show variables like ‘innodb_old%’


 

innodb_old_blocks_pct:控制old page子链表在LRU链表中的长度。
innodb_old_blocks_time:控制old page子链表的数据页移动到new page 子链表中的时机。

 

InnoDB缓存池预热

MySQL服务启动一段时间后,InnoDB会将经常访问的数据置入InnoDB缓冲池中。当InnoDB缓冲池的大小是几十GB甚至是几百GB时,由于某些原因(例如数据库定期维护)重启MySQL服务,如何将之前InnoDB缓冲池中的热数据重新加载到InnoDB缓冲池中?

从5.6版本开始,MySQL支持关闭MySQL服务时将内存中的热数据保存到硬盘,MySQL重启后首先将硬盘中的如数据加载到InnoDB缓冲池中,以便缩短warmup进程的时间,提高业务繁忙高并发时的效率。

查看有关InnoDB缓冲池预热功能参数设置


show variables like '%innodb%pool%';


innodb_buffer_dump_at_shutdown:默认为关闭OFF。如果开启该参数,停止MySQL服务时,InnoDB将InnoDB缓冲池中的热数据保存到本地硬盘。
innodb_buffer_pool_load_at_startup:默认为关闭OFF。如果开启该参数,启动MySQL服务时,MySQL将本地热数据加载到InnoDB缓冲池中。
innodb_buffer_pool_load_now:默认为关闭OFF。如果开启该参数,停止MySQL服务时,以手动方式将InnoDB缓存池中的热数据保存到本地硬盘。
innodb_buffer_pool_filename:如果开启InnoDB预热功能,停止MySQL服务时,MySQL将InnoDB缓冲池中的热数据保存到数据库根目录中,默认文件名为ib_buffer_pool.
innodb_buffer_pool_load_aborr:默认为关闭OFF。如果开启该参数,即便开启InnoDB预热功能,启动MySQL服务时,MySQL也不会将本地硬盘的热数据加载到InnoDB缓冲池中。

开启InnoDB缓冲池预热后,查看InnoDB缓冲池预热的状态信息


show variables like 'Innodb_buffer%'


 

标签:BufferPool,缓存,管理机制,链表,InnoDB,MySQL,innodb,数据
From: https://blog.51cto.com/u_6353447/5873674

相关文章

  • InnoDB体系结构及工作原理
    概念InnoDB主要包括了内存池、后台线程以及存储文件。INNODB的三大特性:插入缓存,两次写,自适应hash内存池又是由多个内存块组成的,主要包括BufferPool、redolog缓冲等,解决cpu......
  • original: Error: Unknown storage engine 'InnoDB'
    问题Nodejs工程下,用sequelize向一个现有的MySQL数据库中初始化数据时报错,如题:original:Error:Unknownstorageengine'InnoDB'ENVMySQL5.6Sequelize:^6......
  • Mysql数据库引擎MYISAM和INNODB详解
    一、数据库​​引擎​​数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务,从而满足企业内大多数需要处理大量数据的应用程......
  • MySQL8.0新特性—InnoDB增强
    1.自增变量持久化在MySQL8.0之前的版本中,自增列计数器置于内存中,并不会持久化到磁盘,当数据库重启后,会根据selectmax(id)+1fromxxx重新计算当前自增列值,这种现象在某些......
  • MyISAM与InnoDB的区别
    MyISAM与InnoDB的区别是什么?这是一个常见的面试题,我们要具从不同的角度解读一下。1、 存储结构MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,......
  • Innodb加锁规则
    加锁顺序普通select查询获取表级锁:MDL读锁不需要其他锁:因为使用的是MVCC,所以不需要行锁ps:很多地方都说使用了MVCC就不需要加锁,实际上是不需要行锁,MDL读锁还是需......
  • InnoDB存储引擎,底层主键索引是聚集索引,那他的结构是什么样的?
    InnoDB存储引擎类型的表,底层是怎么存储数据的?   InnoDB存储引擎类型的表对应的文件,只有两个。Frm后缀文件,不用多说,是用来存放表结构的文件。InnoDB存储引擎类型的......
  • MySQL---InnoDB数据存储结构
    InnoDB数据存储结构数据库的存储结构:页磁盘与内存交互的基本单位:页  页结构概述页的大小 页的上层结构页的内部结构......
  • Mysql InnoDB多版本并发控制MVCC
    参考书籍《mysql是怎样运行的》系列文章目录和关于我一丶为什么需要事务隔离级别mysql是一个客户端/服务断软件,对于同一个服务器来说,可以有多个客户端进行连接,每一个客......
  • MySQL启动报错[ERROR] InnoDB: Trying to access page number 4294967295 in space 0,
    这篇文章是原来的《记一次mysql故障处理》,但是随着mysql问题越来越多,我感觉还是集合到一篇里面比较好,也方便之后问题复现的查找一、记一次mysql故障处理最近遇到的问......