image.png
Innodb有多个内存块(缓冲池innodb_buffer_pool_size、重做日志缓冲池innodb_log_buffer_size、额外内存池innodb_additional_mem_pool_size),这些内存块组成了一个大的内存池,负责如下工作:

  1. 维护内部数据结构
  2. 缓存磁盘数据:对磁盘数据修改前,在此缓存
  3. 重做日志缓冲
  4. 查看缓冲池(innodb_buffer_pool_size)大小,同理可看重做日志缓冲池和额外内存缓冲池 image.png

1. 缓冲池

缓冲池结构

image.png

读取

将数据库文件按页(16K)读取到缓冲池,使用LRU(最近最少未使用)来保留缓冲池中的缓存数据。

修改

首先修改缓冲池中的页,发生修改后该页即为脏页,然后再按照一定的频率将缓冲池中的页刷新到文件

查看缓冲池使用情况

  1. mysql> show engine innodb status\G;

image.png
我们可以看到返回结果中一项BUFFER POOL AND MEMORY,可查看当前INNODB的内存使用情况。

  1. Buffer pool size:缓冲池分配了多少页,这里一共分配了8192页,每页16K,共8192*16/1024=128M
  2. Free buffers:当前空闲缓冲帧
  3. Database pages:已经使用的缓冲帧
  4. Modified db pages:脏页的数量

    2. 日志缓冲

    日志缓冲将重做日志信息先放入这个缓冲区,然后按照一定的频率将其刷新到重做日志文件。一般每秒钟都会将重做日志刷新到日志文件,因此我们只需要保证每秒产生的十五辆在这个缓冲大小之内即可。
    当重做日志缓冲池剩余空间小于1/2时,重做日志缓冲会被刷新到重做日志文件。

    3. 额外内存池

    对一些数据结构本身分配内存时,需要从额外的内存池中申请,当该区域的内存不够时,会从缓冲池中申请。