关于 LRU_List ,Free_List,Flush_List的介绍:
 
LRU算法:(Latest Recent Used)最近最少使用
     数据库的缓冲池通过LRU算法来进行管理。
     即,最频繁使用的页在LRU列表的前端,最少使用的页在LRU列表的尾端。当缓冲不能存放新读取到的页时,首先释放LRU列表尾端的页。
 
InnoDB存储引擎中,缓冲池中页默认大小16KB,也通过LRU列表对缓冲池进行管理,并对传统的LRU算法做了优化。在LRU列表中加入了midpoint位置。
     
 
midpoint位置设置:innodb_old_block_pct 默认:37 也就是3/8位置
midpoint之前的称为:new列表,之后的称为:old列表。
 
问题 1:为什么不将读取的页放入到LRU列表的首部?
      答:LRU列表,当不能存放新读取的页时,会释放尾部的页。若直接插入首部位置,某些SQL操作会使缓冲池中的页被刷新出去,尤其是读取大量的新页,直接插入首部,会使活跃的页逐渐被刷新出去。比如:索引或数据的全表扫描。这些页可能只在这次中用,但是活跃的页被刷新出去,下次读取该页,需要再次访问磁盘。
 
问题 2:解决类似全表扫描操作时,LRU列表中热点数据不被刷出
      答:设置参数:innodb_old_block_time:表示页读取到mid位置后需要等待多久才会被加入到LRU列表的热端。
          设置参数:innodb_old_block_pct :通过预估热点数据百分比。37-->20,降低mid位置,增加热点范围。
 
Free list:
 
LRU管理已经读取的页,数据库启动时,LRU列表是空的,没有页。此时的页都放在Free list。当需要从缓冲池中分页时,先查看Free list是否有空闲的页,若有,则从Free list中删除该页,放入到LRU列表。
若没有,则根据LRU算法,释放LRU列表尾端的页,将该内存分给新页。
 
page made young :当页从LRU列表的old部分加入到new部分时,此时的操作称为:page made young
page not made young:因为innodb_old_block_time设置,导致页没有从old部分移动到new部分的操作称为:page not made young。
 
如图:
mysql>SHOW ENGINE INNODB STATUS\G
 
---BUFFER POOL 3
Buffer pool size        204799     # *16KB
Buffer pool size, bytes 3355426816
Free buffers            1024
Database pages          193488
Old database pages      145096
Modified db pages       414
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 12977471, not young 326415366
 
Database pages :表示LRU列表中页的个数
 
Database pages + Free buffers <Buffer pool size
 
缓冲池中的页 可能分配给:自适应哈希索引,lock信息,insert buffer等页,这些页不需要LRU算法运行维护,因此不在LRU列表中。
 
缓冲池的运行状态:
1.
SELECT POOL_ID,HIT_RATE,PAGES_MADE_YOUNG,PAGES_NOT_MADE_YOUNG FROM `information_schema`.`INNODB_BUFFER_POOL_STATS`;
 
mysql>SHOW ENGINE INNODB STATUS\G
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 12977554, not young 326416098
0.00 youngs/s, 0.00 non-youngs/s
Pages read 3489114, created 521364, written 31146169
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 193491, unzip_LRU len: 0
I/O sum[1]:cur[0], unzip sum[0]:cur[0]
 
2.通过INNODB_BUFFER_PAGE_LRU表查看LRU中每个页的状态
 
LRU中对于页的处理:
InnoDB存储引擎1.0.x版本开始支持压缩页的功能,即将16KB的页压缩成:1KB,2KB,4KB,8KB.
页的大小发生变化,LRU的管理页变。
非16KB的页,用unzip_LRU列表进行管理。
 
mysql>SHOW ENGINE INNODB STATUS\G
LRU len: 193491, unzip_LRU len: 0
I/O sum[1]:cur[0], unzip sum[0]:cur[0]
 
---LRU len:所有的页,包括压缩页。
---LRU len = unzip_LRU len + 非压缩页
 
表页的压缩比例不同,unzip_LRU是怎么从缓冲池中分配内存的?
     答:unzip_LRU也是有自己的分类的,根据1,2,4,8分类。
     unzip_LRU列表对不同压缩页大小的页进行分别管理。其次通过伙伴算法进行内存的分配:以4KB为例
1)检查4KB的unzip_LRU列表,是否有可用的空闲页
2)若有,直接使用
3)否则,检查8KB的unzip_LRU列表
4)若能得到空闲页,将页分成2个4KB页,存放到4KB的unzip_LRU列表中。
5)若不能得到,从LRU列表中申请16KB的页,将页分成1个8KB,2个4KB,分别放在对应的unzip_LRU中。
 
Flush list
在LRU列表中的页被修改后,称该页为脏页(dirty page),即缓冲池中的页和磁盘上的页数据不一致。这时会通过checkpoint机制将脏页刷新回磁盘,而Flush list中的页即为脏页列表。
注:脏页既存在于LRU列表,也存在于Flush列表中。
LRU:用来管理缓冲池中页的可用性
Flush:用来管理将页刷新回磁盘。
 
mysql>SHOW ENGINE INNODB STATUS\G
 
---BUFFER POOL 3
Buffer pool size        204799     # *16KB
Buffer pool size, bytes 3355426816
Free buffers            1024
Database pages          193488
Old database pages      145096
Modified db pages       414      #显示脏页的数量
 
 --ok

MySQL-LRU_List Free_List Flush_List的更多相关文章

  1. 关于MySQL checkpoint

    Ⅰ.Checkpoint 1.1 checkpoint的作用 缩短数据库的恢复时间 缓冲池不够用时,将脏页刷到磁盘 重做日志不可用时,刷新脏页 1.2 展开分析 page被缓存在bp中,page在bp ...

  2. MySQL redo lock 死锁问题排查 & 解决过程

    版权声明:本文由张青林原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/181 来源:腾云阁 https://www.qclo ...

  3. MySQL · 性能优化· InnoDB buffer pool flush策略漫谈

    MySQL · 性能优化· InnoDB buffer pool flush策略漫谈 背景 我们知道InnoDB使用buffer pool来缓存从磁盘读取到内存的数据页.buffer pool通常由数 ...

  4. MySQL · 引擎特性 · InnoDB 事务子系统介绍

    http://mysql.taobao.org/monthly/2015/12/01/ 前言 在前面几期关于 InnoDB Redo 和 Undo 实现的铺垫后,本节我们从上层的角度来阐述 InnoD ...

  5. MySQL · 引擎特性 · InnoDB奔溃恢复

    前言 数据库系统与文件系统最大的区别在于数据库能保证操作的原子性,一个操作要么不做要么都做,即使在数据库宕机的情况下,也不会出现操作一半的情况,这个就需要数据库的日志和一套完善的奔溃恢复机制来保证.本 ...

  6. MySQL · 引擎特性 · InnoDB崩溃恢复

    前言 数据库系统与文件系统最大的区别在于数据库能保证操作的原子性,一个操作要么不做要么都做,即使在数据库宕机的情况下,也不会出现操作一半的情况,这个就需要数据库的日志和一套完善的崩溃恢复机制来保证.本 ...

  7. 【MySQL】InnoDB 内存管理机制 --- Buffer Pool

    InnoDB Buffer Pool 是一块连续的内存,用来存储访问过的数据页面 innodb_buffer_pool_size 参数用来定义 innodb 的 buffer pool 的大小 是 M ...

  8. mysql内存管理

    1 内存管理结构 mysql有自己的内存申请和释放机制 mysql层有mem_root innodb层有mem_heap,mem_pool,buf_pool 它们的结构图如下 2 mem_root m ...

  9. MySQL系列:innodb源代码分析之内存管理

    在innodb中实现了自己的内存池系统和内存堆分配系统,在innodb的内存管理系统中,大致分为三个部分:基础的内存块分配管理.内存伙伴分配器和内存堆分配器.innodb定义和实现内存池的主要目的是提 ...

随机推荐

  1. 第一百七十五节,jQuery,工具函数

    jQuery,工具函数 学习要点: 1.字符串操作 2.数组和对象操作 3.测试操作 4.URL 操作 5.浏览器检测 6.其他操作 工具函数是指直接依附于 jQuery 对象,针对 jQuery 对 ...

  2. java web 开发入门实例

    学习是个技巧活,关键是要找到重点的地方,新手在这方面的坑尤其多.看别人的教程一步一步的跟着做,隔几步就遇到一个新知识点,忍不住就百度往深处了解,一晃半天就过去了. 有的知识点要深入学习的,有的是了解下 ...

  3. 很easy的js双向绑定框架(二):控制器继承

    初衷 上一篇已经实现了数据的双向绑定,但model的控制范围是整个文档.在实际project中必需要有作用范围,以便做ui模块的拆分. 这一篇,我们希望实现像angularjs一样的控制器继承: 1. ...

  4. vivo 手机的USB调试功能

  5. windows下 兼容Python2和Python3

    windows下同时安装了python2和python3时,都可以配置环境变量,如果在命令行里输入python命令,windows会去环境变量里寻找Python的安装位置,如果先找到pytoon2的, ...

  6. 【BZOJ2186】[Sdoi2008]沙拉公主的困惑 线性筛素数

    [BZOJ2186][Sdoi2008]沙拉公主的困惑 Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M! ...

  7. 《从零开始学Swift》学习笔记(Day 12)——说几个特殊运算符

    原创文章,欢迎转载.转载请注明:关东升的博客   除了一些常用的运算符,还有一些其他的: •      引用号(.):实例调用属性.方法等操作符. •      问号(?):用来声明可选类型. •   ...

  8. 疯狂创客圈 JAVA死磕系列 总目录

    无编程不创客,无案例不学习.疯狂创客圈,一大波高手正在交流.学习中! 疯狂创客圈 Java 死磕系列: [博客园 总入口]  QQ群:104131248 [Java 聊天室] 实战从0开始,打造100 ...

  9. Django 进阶(分页器&中间件)

    分页 Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views h ...

  10. 2、Python request、BeautifulSoup(download mm_pic)

    import requests from bs4 import BeautifulSoup import os class DownLoadImg(object): def __init__(self ...