一、整体架构

innodb_buffer_pool_instances越大越好吗 innodb buffer pool instance_数据库

二、内存结构介绍

Buffer Pool

innodb_buffer_pool_instances越大越好吗 innodb buffer pool instance_数据_02

介绍

为了加快数据的存储和读取效率,InnoDB将数据和硬盘的交互分为两步:

  1. 将数据的增加和修改直接在Buffer Pool内存中进行,并记录到undo/redo日志
  2. 通过后台线程,定时将Buffer Pool中的数据更改变同步到硬盘

组成

Buffer Pool的构成单元是Page页,其中的一个部分是Change Buffer,Change Buffer主要负责保存数据的增/删/改操作,从硬盘中读取数据时,会先合并Change Buffer中的增/删/改操作,再保存到缓存Page页中并返回给客户端;其他部分则用于放置缓存Page页,当数据第一次被读取时,会把数据从文件系统中读取出来放在Buffer Pool的Page页中,之后读取数据时,则直接从Buffer Pool中读取,当发生数据修改时,如果该Page页存在缓存中,会修改相应的Page页,被修改后的Page页被称为脏页,需要进行同步。

同步

innodb_buffer_pool_instances越大越好吗 innodb buffer pool instance_架构_03

后台线程会定时将Buffer Pool的数据刷新到硬盘,对于Change Buffer中的修改和新增操作需要同步到文件系统,同时,对于缓存中的脏页也需要刷新到硬盘。此处的重点是不通过操作系统缓存,直接刷新到硬盘。

置换算法

对于Page页的置换算法,此处采用了一种变形的LRU算法。Page组成一个链表,按照5/8和3/8的比例分为新页子序列和旧页子序列。插入时从分界点插入,当Page页被读取时,就会被移动到新页子序列的头部,按照这种方式,当新的Page页需要插入序列而空间不足时,旧页子序列的末尾Page将被淘汰。

innodb_buffer_pool_instances越大越好吗 innodb buffer pool instance_缓存_04

Log Buffer

innodb_buffer_pool_instances越大越好吗 innodb buffer pool instance_架构_05

用于缓冲将要写入到硬盘log file文件的日志信息(redo/undo),默认大小16MB。和Buffer Pool的刷新机制不同的是,该缓冲区的日志信息首先会被定时刷新到操作系统缓存中,再由操作系统缓存定时刷新到硬盘里面。

三、硬盘结构介绍

innodb_buffer_pool_instances越大越好吗 innodb buffer pool instance_数据库_06

Tablespace

注意:表空间是一个逻辑上的空间划分,比如一个数据库下有多个表格,而这些表格可各自属于不同的表空间。

System Tablespace

innodb_buffer_pool_instances越大越好吗 innodb buffer pool instance_数据_07

系统表空间:

  • 是Change Buffer的存储区域。在增删改操作被实际更新到数据文件之前,这些操作会先被存储在系统表空间中,之后被线程作用到具体的数据文件。
  • 是系统表的索引和数据存储区域。当创建的表格是在系统表空间下创建时,相应的索引和数据信息也会被保存在系统表空间下。
  • 在8.0之前的版本中,系统表空间还包含了InnoDB数据字典(元数据)和Doublewrite Buffer。从8.0开始,这两个区域都独立了出来在各自单独的文件中。

File-Per-Table Tablespaces

innodb_buffer_pool_instances越大越好吗 innodb buffer pool instance_表空间_08

  • 这种类型的表空间下存储的数据文件特点是,对于每一个表格,都会创建一个单独的文件table_name.idb来保存该表的索引和数据信息,这点和系统表空间用一个ibdata1文件来存储所有的表格索引和数据有所不同。
  • 一般情况下,单表文件会被创建在data目录下相应的数据库schema目录下,但是也可以在创建表格时通过指定data directory的值将表格文件放置在data目录外的其他地方。
  • 当表格被Drop之后,该表格原先占用的空间会被释放归还给操作系统。

General Tablespaces

innodb_buffer_pool_instances越大越好吗 innodb buffer pool instance_缓存_09

  • 通用表空间和系统表空间类似,也是一个文件保存多个表格的数据和索引信息,不过与系统表空间不同的是,通用表空间可以创建多个。
  • 通用表空间的数据可以放置在MySQL的data目录之下,也可以放置在data目录外的其他地方。
  • 当表格被Drop后,该表格原本的空间不会被释放归还给操作系统,而是为该表空间下新的表格数据使用。

Undo Tablespaces

innodb_buffer_pool_instances越大越好吗 innodb buffer pool instance_数据_10

  • Undo表空间是用来保存Undo日志的,Undo日志用来存储最后的事务的最新修改回滚段信息。
  • 默认创建两个系统级别的Undo表空间,名字分别为undo_001和undo_002。
  • 用户可以自己创建表空间,创建时要求需要以.ibu作为扩展名。

Temporary Tablespaces

innodb_buffer_pool_instances越大越好吗 innodb buffer pool instance_数据库_11

  • 临时表空间分为两类:Session级临时表空间和Global级临时表空间
  • Session级表空间以.ibt结尾,工作时,一般两个表空间为一组,一个用于保存用户创建的临时表数据,另一个用于引擎工作内部使用创建临时表空间。Session表空间会通过一个表池子进行管理,初始化时池子中会创建10个临时表空间,工作时从池子中获取表空间,工作完毕则归还到池子中。
  • Global级临时表空间初始化为ibtmp1。用户创建的临时表格数据发生修改时,针对该修改的回滚数据就保存在ibtmp1中。

Doublewrite Buffer

innodb_buffer_pool_instances越大越好吗 innodb buffer pool instance_数据库_12

  • 在Buffer Pool中的文件刷新到具体的数据文件中前,会先保存在双写缓冲区中,如果在把Page写入到具体的数据文件时,系统某个进程异常退出,可以做崩溃恢复。
  • 默认以#作为文件名前缀,分为两个文件,分别对应Buffer Pool的flush list和LRU list数据Page页。

Redo Log

innodb_buffer_pool_instances越大越好吗 innodb buffer pool instance_数据_13

  • 用于保存redo日志信息,当InnoDB异常中断时,未刷新到数据文件的脏页等数据可通过该文件进行重做,恢复数据。
  • 初始化为两个文件,大小固定,采用循环写入方式进行工作,即一个文件写入完毕后,覆盖另外一个文件的数据,这样保证新的数据可以被写入,同时旧的不用的数据被自动覆盖。