mysql的LRU队列详解
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队列详解相关推荐
- MySQL事务以及MVCC详解
文章目录 什么是事务 事务的特性(ACID) ACID之间的关系: Innodb的隔离性有哪些 每个隔离性会造成什么问题 事务怎么保证ACID 事务怎么保证一致性 事务怎么保证原子性 事务怎么保证持久 ...
- linux如何查看kafka消息队列,kafka以及消息队列详解
kafka以及消息队列详解 Kafka 是LinkedIn 开发的一个高性能.分布式的消息系统. 用途:广泛用于日志收集.流式数据处理.在线和离线消息分发等场景. 1. Kafka 将消息流按Topi ...
- MySQL之SQL优化详解(二)
目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...
- laravel 调试mysql_Laravel - MySQL数据库的使用详解3(Query Builder用法2:新增、修改、删除)...
五.新增.修改.删除操作 在前文中我介绍了如何使用Query Builder(查询构造器)进行数据查询,下面接着介绍如何使用它进行数据的增.删.改操作.同样假设我们有如下用户表(user): 1,新增 ...
- MySQL高级之explain详解
MySQL高级之explain详解 文章目录 MySQL高级之explain详解 一.expalin命令详解 1.使用方式 2.结果显示 3.主要的字段信息 4.作用 二.id字段 三.select_ ...
- JavaScript数据结构与算法——队列详解(下)
接下来会借助本人另一篇文章JavaScript数据结构与算法--队列详解(上)中实现的队列类及其方法实现一个应用. 配对问题 需求分析:在一个文件中保存着一份男女混合的数据,名称前以B开头表示男士,以 ...
- NodeJS+Express+mySQL服务端开发详解
NodeJS+Express+mySQL服务端开发详解 随着NodeJS的发展,现在已经被很多人熟知,NodeJS已经成为了前端开发人员必备的技能.本文不会对NodeJS过多介绍 如果你感兴趣可以访问 ...
- mysql查询优化explain命令详解
转载自 mysql查询优化explain命令详解 mysql查询优化的方法有很多种,explain是工作当中用的比较多的一种检查方式.explain翻译即解释,就是看mysql语句的查询解释计划,从解 ...
- 转:Java 7 种阻塞队列详解
转自: Java 7 种阻塞队列详解 - 云+社区 - 腾讯云队列(Queue)是一种经常使用的集合.Queue 实际上是实现了一个先进先出(FIFO:First In First Out)的有序表. ...
最新文章
- 《树莓派学习指南(基于Linux)》——第 2 章 开始探索 2.1 欢迎使用LXDE
- mongDB批量插值
- 汉诺塔III HDU - 2064
- qt中实现左右分割线_Qt项目中,实现屏幕截图并生成gif的详细示例(值得细读)...
- 网站安全检测 Web 安全测试工具
- 【菜鸡的LeetCode答案】【C#】7.反转整数
- ffmpeg 转码异常记录
- 网络攻击与防范图谱——By科来
- 冒泡排序c语言子程序,C语言之冒泡排序算法
- logo设计的色彩颜色搭配-北泓设计
- 基于微信小程序的校园食堂窗口自助点餐系统#毕业设计
- RTC实时时钟实验学习笔记一
- Jupyter notebook更改字体
- 手抛飞机大改装(4种机型,7种改法)干货!!
- Android Manifest
- 华为又收天才少女,进华为的标准是什么?
- Linux内核设计与实现---模块
- 【9007】最短路径
- 决策树分类算法研究及用例
- turtle库函数大全
热门文章
- 苹果系统Fn键怎样使用?
- 8、信息收集篇————Kali Linux自带工具
- linux内核编译时bad register name `%dil'错误
- DFRobot离线语音识别模块真实测评
- 黑客软件大众化 【爆吧机的出现】杨丞琳贴吧遭网友攻陷
- 机器学习笔记04:逻辑回归(Logistic regression)、分类(Classification)
- spark配置elasticsearch属性汇总(基于es7)
- 华为云等保解决方案,全流程等保服务,帮助企业守护信息安全
- Tor 在 linux上使用
- MYSQL笔试题(考试题)附带答案