MySQL的缓冲池(innodb_buffer_pool_instances,innodb_buffer_pool_size)是通过LRU算法来进行管理的。即最频繁使用的页在LRU列表的最前端,而最少使用的页在LRU列表的尾端。当缓冲池不能存放新读取到的页时,将首先释放LRU列表尾端的页。

在INNODB引擎中,缓冲池页的大小默认为16KB。

在INNODB引擎中,有一个midpoint位置。新读取到的页,虽然是最新访问的页,但并不直接放到LRU队列的首部,而是放到LRU列表的midpoint位置。

midpoint位置是通过参数innodb_old_blocks_pct来控制的。表示新读取的页插入到LRU列表尾端的37%的位置。在INNODB中,把midpoint之后的列表称为old列表,之前的列表称为new列表。可以简单的理解为new列表中的页都是活跃的热点数据。

为什么不把读入的页直接放入LRU队列的首部呢?是因为如此做可能会把大量频繁使用的数据页换出LRU队列,带来再次磁盘读取的IO压力。

数据页在midpoint位置,什么情况下会进入NEW列表呢?是通过参数innodb_old_blocks_time来控制的。该参数表示,页读取到midpoint位置后需要等多久才会被加入到LRU队列的热端。

重新调整两个参数的值:

mysql> set  global  innodb_old_blocks_pct=20;

mysql> set global innodb_old_blocks_time=500;

数据页在LRU队列上的移动规则:

当数据库刚启动的时候,LRU列表是空的,所有的页都放在FREE列表中。当需要重缓冲池中分页时,首先从FREE列表中查找是否有可用的空闲页,如果有则将该页从FREE列表中删除,放入LRU列表中;如果没有,则根据LRU算法,淘汰LRU列表尾部的页,将该内存空间分配给新的页。

当页从LRU列表的OLD部分加入到NEW部分时,称此时发生的操作为page made young;如果因为innodb_old_blocks_time的设置导致页没有从old部分移动到new部分的操作,称为page not made young。

通过命令 show engine innodb status\G;可以查看LRU队列的使用情况:

----------------------
BUFFER POOL AND MEMORY
----------------------
Total large memory allocated 137428992
Dictionary memory allocated 140621
Buffer pool size   8192
Free buffers       7912
Database pages     280
Old database pages 0
Modified db pages  0
Pending reads      0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 245, created 35, written 40
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 988 / 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: 280, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

Buffer pool size:表示当前缓冲池中内存页的数量,内存池的大小=Buffer pool size*16KB

Free buffers:表示当前FREE列表中页的数量;

Database pages:LRU列表中页的数量;

Modified db pages:显示了脏页的数量;

Pages made young 0, not young 0  :表示是否发生了页在LRU队列上的移动;

0.00 youngs/s, 0.00 non-youngs/s:表示每秒两类操作发生的次数;

Buffer pool hit rate:表示缓冲池的命中率,正常情况下命中率如果低于95%,则需要观察是否因为全表扫描引起了LRU队列被污染的问题

Per second averages calculated from the last 18 seconds:表示show engine innodb status\G;打印的是过去18秒内的数据库状态。

观察缓冲池的运行状态:

select pool_id,hit_rate,pages_made_young,pages_not_made_young from information_schema.innodb_buffer_pool_stats\G;

查看LRU列表中每个页的具体信息:

select table_name,space,page_number,page_type from information_schema.innodb_buffer_page_lru where space=1;

脏页的刷新:

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

mysql的LRU队列详解相关推荐

  1. MySQL事务以及MVCC详解

    文章目录 什么是事务 事务的特性(ACID) ACID之间的关系: Innodb的隔离性有哪些 每个隔离性会造成什么问题 事务怎么保证ACID 事务怎么保证一致性 事务怎么保证原子性 事务怎么保证持久 ...

  2. linux如何查看kafka消息队列,kafka以及消息队列详解

    kafka以及消息队列详解 Kafka 是LinkedIn 开发的一个高性能.分布式的消息系统. 用途:广泛用于日志收集.流式数据处理.在线和离线消息分发等场景. 1. Kafka 将消息流按Topi ...

  3. MySQL之SQL优化详解(二)

    目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...

  4. laravel 调试mysql_Laravel - MySQL数据库的使用详解3(Query Builder用法2:新增、修改、删除)...

    五.新增.修改.删除操作 在前文中我介绍了如何使用Query Builder(查询构造器)进行数据查询,下面接着介绍如何使用它进行数据的增.删.改操作.同样假设我们有如下用户表(user): 1,新增 ...

  5. MySQL高级之explain详解

    MySQL高级之explain详解 文章目录 MySQL高级之explain详解 一.expalin命令详解 1.使用方式 2.结果显示 3.主要的字段信息 4.作用 二.id字段 三.select_ ...

  6. JavaScript数据结构与算法——队列详解(下)

    接下来会借助本人另一篇文章JavaScript数据结构与算法--队列详解(上)中实现的队列类及其方法实现一个应用. 配对问题 需求分析:在一个文件中保存着一份男女混合的数据,名称前以B开头表示男士,以 ...

  7. NodeJS+Express+mySQL服务端开发详解

    NodeJS+Express+mySQL服务端开发详解 随着NodeJS的发展,现在已经被很多人熟知,NodeJS已经成为了前端开发人员必备的技能.本文不会对NodeJS过多介绍 如果你感兴趣可以访问 ...

  8. mysql查询优化explain命令详解

    转载自 mysql查询优化explain命令详解 mysql查询优化的方法有很多种,explain是工作当中用的比较多的一种检查方式.explain翻译即解释,就是看mysql语句的查询解释计划,从解 ...

  9. 转:Java 7 种阻塞队列详解

    转自: Java 7 种阻塞队列详解 - 云+社区 - 腾讯云队列(Queue)是一种经常使用的集合.Queue 实际上是实现了一个先进先出(FIFO:First In First Out)的有序表. ...

最新文章

  1. 《树莓派学习指南(基于Linux)》——第 2 章 开始探索 2.1 欢迎使用LXDE
  2. mongDB批量插值
  3. 汉诺塔III HDU - 2064
  4. qt中实现左右分割线_Qt项目中,实现屏幕截图并生成gif的详细示例(值得细读)...
  5. 网站安全检测 Web 安全测试工具
  6. 【菜鸡的LeetCode答案】【C#】7.反转整数
  7. ffmpeg 转码异常记录
  8. 网络攻击与防范图谱——By科来
  9. 冒泡排序c语言子程序,C语言之冒泡排序算法
  10. logo设计的色彩颜色搭配-北泓设计
  11. 基于微信小程序的校园食堂窗口自助点餐系统#毕业设计
  12. RTC实时时钟实验学习笔记一
  13. Jupyter notebook更改字体
  14. 手抛飞机大改装(4种机型,7种改法)干货!!
  15. Android Manifest
  16. 华为又收天才少女,进华为的标准是什么?
  17. Linux内核设计与实现---模块
  18. 【9007】最短路径
  19. 决策树分类算法研究及用例
  20. turtle库函数大全

热门文章

  1. 苹果系统Fn键怎样使用?
  2. 8、信息收集篇————Kali Linux自带工具
  3. linux内核编译时bad register name `%dil'错误
  4. DFRobot离线语音识别模块真实测评
  5. 黑客软件大众化 【爆吧机的出现】杨丞琳贴吧遭网友攻陷
  6. 机器学习笔记04:逻辑回归(Logistic regression)、分类(Classification)
  7. spark配置elasticsearch属性汇总(基于es7)
  8. 华为云等保解决方案,全流程等保服务,帮助企业守护信息安全
  9. Tor 在 linux上使用
  10. MYSQL笔试题(考试题)附带答案