网站为什么要seo,企业自建站案例,如何进行电子商务网站建设,wordpress首页自定义Buffer Pool机制理解
一、为什么使用Buffer Pool#xff1f;
众所周知#xff0c;磁盘数据是以数据页的形式来去读取的#xff0c;一个数据页默认大小 16K#xff0c;也就是说你本意只想读取一行数据#xff0c;但是它会给你加载一页的数据到buffer pool里面。这样的话就…Buffer Pool机制理解
一、为什么使用Buffer Pool
众所周知磁盘数据是以数据页的形式来去读取的一个数据页默认大小 16K也就是说你本意只想读取一行数据但是它会给你加载一页的数据到buffer pool里面。这样的话就能减少与磁盘的交互次数从而提升效率。
二、什么是Buffer Pool?
是一块内存区域当数据库操作数据的时候把磁盘上的数据加载到buffer pool对buffer pool数据进行增删改查不直接和磁盘打交道。默认大小 128M
SHOW VARIABLES LIKE %innodb_buffer_pool_size%; -- 查看buffer_pool大小 默认128M
SHOW VARIABLES LIKE %innodb_old_blocks_pct%; -- LRU链表冷热区域配置 默认3 7
SHOW VARIABLES LIKE %innodb_old_blocks_time%; -- LRU链表冷区域的数据隔多久可以放入到热区域
SHOW VARIABLES LIKE %innodb_file_size%; -- 单个logfile的大小 默认48M
SHOW VARIABLES LIKE %innodb_log_file_in_group%; -- 配置有几个logfile
SHOW VARIABLES LIKE %innodb_log_buffer_size%; -- redo log buffer的大小 默认16M
SHOW VARIABLES LIKE %innodb_flush_log_at_trx_commit%; -- redo log buffer 中的内容间隔多久刷新到磁盘 默认1s三、Buffer Pool运行机制
当我们读取数据的时候如果buffer pool中不存在则会从磁盘加载到buffer pool然后一直读取数据就会一直加载所以buffer pool就会有爆满的时候。这时候就要采取淘汰策略buffer pool采取的LRU最近最少使用淘汰策略。 在此之前先说的是使用LRU策略淘汰的时候就会出现下面的所演示的现象有数据的控制块是不连续的这时候再读取数据到buffer pool的时候要填充到哪个空白的区域–就要用到free链表
1. free链表
主要管理空白区域该链表会有一个基节点用于管理链表有多少空白的控制块还有两个结点一个连接头结点一个连接尾结点。当读取数据到buffer pool的时候会找free链表的头结点对应的控制块进行填充当进行控制块淘汰的时候空白的控制块就会连接free链表的尾结点。
2. flush链表
当我们进行update语句的时候就会对数据进行修改此时也是对buffer pool的数据进行修改有数据进行修改又没刷新到磁盘的这页数据我们称为脏页。mysql后台线程会对这些脏页进行刷盘但是要刷哪些页此时就得靠flush链表了。 flush链表主要管理上面所说的脏页区域该链表会有一个基节点用于管理链表有多少脏页的控制块同样有两个结点一个连接头结点一个连接尾结点。当mysql后台线程进行刷盘的时候就会找到flush链表有哪些是脏页来进行刷盘。
3.lru链表
当我们读取一页的数据到buffer pool的时候这一页的数据就会信息就会被记录到lru链表再读取一页数据后一页的数据的信息会插到之前的页之前。当读取的页又被用的话也会插到链表的头结点所以lru链表最靠前就是最近被使用的数据。当buffer pool满的时候就会进行淘汰lru链表尾部的数据。
但是这样的lru链表是存在问题的比如我们有那么几页是频繁查询的数据页始终位于lru链表的头部部分此时我们执行一个查询数据量非常大的sql,首页会淘汰lru链表尾部的数据块还是不够的话就会淘汰头部那些热点数据块。因此就会影响热点数据所以要对lru链表进行升级。
4.升级版lru链表 升级版的lru链表会分为热数据区域和冷数据区域占比为5:3当我们对数据页进行操作时会插入冷区域的头部淘汰也是淘汰冷区域的尾部。那么冷区域的数据什么时候才能进入热区域呢
首先数据页被访问进入冷区域的时候设为t1该数据页再次被访问的时候设为t2t2减去t1大于1s的时候就会被放入热数据区域。这样就能预防类似全表扫描这样的sql对热数据产生的影响因为一直替换的是冷区域的数据。