作者:M哥
知数堂MySQL第8期学员、知数堂藏经阁项目-星耀队队长
作者:M哥
知数堂MySQL第8期学员、知数堂藏经阁项目-星耀队队长
一、简介
InnoDB维护了一个缓存数据和索引信息到内存的存储区叫做Buffer Pool,它会将最近访问的数据缓存到缓冲区。我们通过配置各个Buffer Pool的参数,可以显著提高MySQL的性能。
InnoDB的Buffer Pool是基于LRU算法来实现的,下面我们可以简单了解一下LRU算法:
least recently used (LRU),InnoDB管理Buffer Pool是将Buffer Pool作为一个list管理,基于LRU算法的管理。当有新的页信息要读入到Buffer Pool里面的时候,Buffer Pool就将最近最少使用的页信息从Buffer Pool当中驱逐出去,并且将新页加入到list的中间位置,这就是所谓的中点插入策略。
一般情况下list 头部存放的是热数据,就是所谓的young page(最近经常访问的数据),list尾部存放的就是old page(最近不被访问的数据)。这个算法就保证了最近经常使用的page信息会被保存在最近访问的sublist,相反的不被经常访问的就会保存在old sublist。而old sublist当中的page信息都是在新数据写入时被驱逐的。
LRU算法有以下的标准算法:
-
3/8的list信息是作为old list,这些信息是被驱逐的对象。
-
list的中点就是我们所谓的old list头部和new list尾部的连接点,相当于一个界限
-
新数据的读入首先会插入到old list的头部,
-
如果是old list的数据被访问到了,这个页信息就会变成new list,变成young page,就会将数据页信息移动到new sublist的头部。
-
在数据库的Buffer Pool里面,不管是new sublist还是old sublist的数据如果不会被访问到,最后都会被移动到list的尾部作为牺牲者。
一般情况下,页信息会被查询语句立马查询到而被移动到new sublist,这就意味着他们会在Buffer Pool里面保留很长一段时间。
表扫描(包括mysqldump或者没有where条件的select等操作)等操作将会刷入大量的数据进入Buffer Pool,同时也会将更多的Buffer Pool当中的信息刷出去,即使这个操作可能只会使用到一次而已。同样的如果 read-ahead后台进程读入大量数据的情况下也是会造成Buffer Pool大量高频的刷新数据页,但是这些操作是可控的,下面会讲到。read-ahead操作简单说一下就是MySQL的一个后台预读进程,能够保证MySQL预读入数据进入Buffer Pool当中。
二、参数一览表
下面先看下InnoDB Buffer Pool的一些相关参数信息,后面会详细解释一下:
1、innodb_buffer_pool_size:这个值是设置InnoDB Buffer Pool的总大小;
2、innodb_buffer_pool_chunk_size:InnoDB Buffer Pool的执行单元 chunk size的大小。这里面有个关系要确定一下,最好按照这个设置 innodb_buffer_pool_size=innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances*N(N>=1);
3、innodb_buffer_pool_instances:设置InnoDB Buffer Pool实例的个数,每一个实例都有自己独立的list管理Buffer Pool;
4、innodb_old_blocks_pct:默认InnoDB