Mysql数据库缓冲池学习笔记

1、缓冲池概念:缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。在数据库当中读取页的操作,首先将从磁盘读到的页存放在缓存池中,这个过程称为将页“FIX”在缓冲池中。下一次再读相同的页时,首先判断该页是不是在缓冲池中。若在,直接读取。否则,读取磁盘上的页。

2、那么如果sql语句修改了缓存池的页的数据,数据是怎么同步到磁盘保存的?

对于数据库中页的修改操作,则首先修改缓存池中的页,然后再以一定的频率刷新到磁盘上。注意:缓冲池刷新回磁盘并不是每次页发生更新时触发,而是通过一种称为Checkpoint的机制刷新回磁盘。这样,是为了进一步提高数据库整体性能。

3、操作系统对mysql数据库缓冲池大小的影响。

32位操作系统下最大值为3G。(用户可以打开操作系统的PAE选项来获得32位操作系统下最大64GB内存的支持)

强烈建议数据库服务器采用64位操作系统

对于InnoDB储存引擎而言,缓冲池配置通过 innodb_buffer_pool_size 来设置

show variables like 'innodb_buffer_pool_size'\G; 查看innodb储存引擎缓冲池大小

4、设置多个缓冲池。

从innodb 1.0.x版本开始,允许多个缓冲池实例。每个页根据哈希值平均分配到不同缓冲池实例中。这样做是为了减少数据库内部资源竞争,增加数据库并发能力。可以通过innodb_buffer_poll_instances来进行配置,该值默认为1。

show variables like 'innodb_buffer_pool_instances'\G;  ------查看innodb储存引擎缓缓存池个数(值)

5、查看每个缓冲池实例对象的运行状态。

可以通过 SHOW ENGINE INNODB STATUS 观察每个缓冲池实例对象运行的状态

mysql5.6版本开始,可以通过information_schema架构下的表INNODB_BUFFER_POOL_STATS来观察缓冲的状态。

sql语句:SELECT POOL_ID,POOL_SIZE,FREE_BUFFERS,DATABASE_PAGES FROM INNODB_BUFFER_POOL_STATS\G;

6、看完上面所述自然就产生一个问题,这么大的缓冲池innodb储存引擎是怎么对它进行管理操作的呢?下面详细讲述 LRU List 和 Free List 和 Flush List。

LRU算法概述:数据库中的缓冲池是通过LRU (Latest Recent Used,最近最少使用)算法来进行管理的。即 最多使用页在LRU列表前端,而最少使用页在LRU列表后端。当缓冲池不能存放新读取到的页时,将首先释放LRU列表中末端的页。

innodb储存引擎也是使用LRU算法,不同的是,它对传统LRU算法做了一些优化。在innodb中LRU列表还加入了midpoint位置。

midpoint位置就是读取到新页时,不是刷新到LRU的首页,而是LRU列表的midpoint位置。这个算法在innodb储存引擎下称为midpoint insertion strategy。在默认值下,该位置在LRU列表长度的5/8处。midpoint位置可有参数 innodb_old_blocks_pct 控制。

show variables like 'innodb_old_blocks_pct'\G;---------查看midpoint位置  单位 %;  value:37,就是 37%。

midpoint之后的页称为oid列表,之前的称为new列表。new列表中的页时最为活跃的数据。

常见的索引或数据扫描sql操作,这类操作需要需要访问表中的许多页,甚至全部页。而这些页通常来说仅仅在这次查找中需要,并不是活跃的热点数据。如果页被放入LRU列表首部,那么可能将所需要的热点数据页从LUR中移除,下次需要读取页时,innodb储存引擎需要再次访问磁盘。为了解决这个问题,innodb储存引擎引入另一个参数,innodb_old_blocks_time,用于表示页读取到mid位置后等待多久才会被加入到LRU列表的热端。

可以通过下面方法使LRU列表的热点尽量不被输出

SET GLOBAL innodb_old_blocks_time=1000;

数据或索引扫描操作

SET GLOBAL innodb_old_blocks_time=0;

如果用户预估自己活跃的热点数据不止63%,那么在执行sql语句前,可以通过下面语句减少热点页可能被刷出的概率。

SET GLOBAL innodb_old_blocks_pct=20;

Free页:当LRU页为空时,首先查看Free列表是否有此空闲页,若有则删除同时添加到LRU列表。如果没有该页,则根据LRU算法,淘汰LRU列表末尾的页,将该内存空间分配给新的页。

当页从LRU列表的old部分加入到new部分时,称此发生操作为page made young,而因为innodb_old_blocks_time 的设置导致页没有从old部分移动到new部分的操作称为page not made young 。可以通过命令 SHOW ENGINE INNODB STATUS 来观察LRU列表及Free列表的使用情况和运行状态。

注意:SHOW ENGINE INNODB STATUS 显示的不是当前的状态,而是过去某个时间的值。

如果Buffer pool hit rate 的值小于95%,用户需要观察是否由于全表扫描引起的LRU列表污染问题。

Flush页:在LRU列表中被修改过的页称为脏页,即缓冲池找中的页和磁盘上的页的数据产生了不一致。这时数据库会通过CHECKPOINT机制将脏页刷新回磁盘而Flush列表中的页即为脏页列表。

注意:脏页即存在LRU列表中,页存在Flush列表中。LRU列表用来管理缓冲池中的页的可用性,Flush 列表用来管理将页刷新回磁盘,二者互不影响。

猜你喜欢

转载自blog.csdn.net/weixin_40896800/article/details/82749368
今日推荐