innodb lru list、free list、flush list

LRU list
innodb中新读取到的页,并不直接放在LRU列表首部,而是放在midpoint位置。默认该位置在LRU列表5/8处。midpoint可有参数innodb_old_blocks_pct控制

mysql> show variables like 'innodb_old_blocks_pct'\G;
*************************** 1. row ***************************
Variable_name: innodb_old_blocks_pct
        Value: 37
1 row in set (0.00 sec)

当有大的查询时,可能会将热点数据页从LRU列表中移除,为了避免这个问题可以通过参数innodb_old_blocks_time的修改来实现,该参数表示页读取到mid位置后需要等待多久才会被加入到LRU列表的热端。

mysql> show variables like 'innodb_old_blocks_time'\G;
*************************** 1. row ***************************
Variable_name: innodb_old_blocks_time
        Value: 1000
1 row in set (0.00 sec)

可以通过innodb status来查看LRU列表和Free列表的使用和运行状态

mysql> show variables like 'innodb_old_blocks_time'\G;
。。。。。。
Buffer pool size   8191
Free buffers       7699
Database pages     491
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 449, created 42, written 101
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 788 / 1000, young-making rate 0 / 1000 not 0 / 1000
。。。。。。

可以看到Buffer pool size共有8179个页,即8179*16k,共128M的缓冲池。
Free buffefreers表示free列表中页的数量
Database pages表示LRU列表中页的数量
Database pages与Free buffers之和不等于Buffer pool size,因为还可能分配给自适应哈希索引、lock信息、insert buffer等页。
因为是本地环境,没有做更新操作,所以即使设置了innodb_old_blocks_time,not young还是为0。
buffer pool hit rate,表示缓冲池命中率,一般不低于95%,如果偏低,要看看是不是有全表扫描造成LRU列表污染。

还可以通过innodb_buffer_pool_stats查看缓冲池的运行状态

mysql> select pool_id,hit_rate,
    -> pages_made_young,pages_not_made_young
    -> from information_schema.innodb_buffer_pool_stats\G;
*************************** 1. row ***************************
             pool_id: 0
            hit_rate: 0
    pages_made_young: 0
pages_not_made_young: 0
1 row in set (0.00 sec)

可以通过innodb_buffer_page_lru 观察每个LRU列表中每个页的具体信息

mysql> select table_name,space,page_number,page_type
    -> from information_schema.innodb_buffer_page_lru where space=1;
+------------------------------+-------+-------------+-------------+
| table_name                   | space | page_number | page_type   |
+------------------------------+-------+-------------+-------------+
| `mysql`.`innodb_table_stats` |     1 |           3 | INDEX       |
| NULL                         |     1 |           1 | IBUF_BITMAP |
+------------------------------+-------+-------------+-------------+
2 rows in set (0.13 sec)

innodb存储引擎支持压缩页功能,即将原本16k的页压缩为1k、2k、4k、8k。所以对于非16k的页通过unzip_LRU列表管理

mysql> show engine innodb status\G;
。。。。。。
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 223, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
。。。。。。

可以看到LRU列表义工223个页,unzip_LRU 列表中没有数据。LRU中的页包含unzip_LRU列表中的页。可以通过innodb_buffer_page_lru来观察unzip_LRU 列表中的页。


mysql> select
    -> table_name,space,page_number,compressed_size
    -> from information_schema.innodb_buffer_page_lru
    -> where compressed_size <> 0;

Flush list
LRU列中数据被修改后,产生脏页。数据库通过checkpoint机制将脏页刷新会磁盘,flush list中的页即为脏页列表。脏页即存在于LRU中,也存在于Flush中。LRU list用于管理缓冲池中页的可用性,Flush list用于将页刷新回磁盘。

mysql> show engine innodb status\G;
。。。。。。
Modified db pages  2456
。。。。。。

Modified db pages显示了脏页的数量。
脏页的数据可通过innodb_buffer_page_lru查询

mysql> select table_name,space,page_number,page_type from information_schema.innodb_buffer_page_lru where oldest_modification>0;
时间: 2024-08-01 17:50:35

innodb lru list、free list、flush list的相关文章

MySQL实战系列4: 主从复制、读写分离、备份恢复全解析

作者介绍 索宁擅长Python开发.MySQL.前端等众多技术领域曾负责众多企业安全架构解决方案 涉猎行业有媒体.出版社.航空运输.医疗.军队.政府.教育等.   一.MySQL主从复制   1.简介   我们为什么要用主从复制   主从复制目的 可以做数据库的实时备份保证数据的完整性 可做读写分离主服务器只管写从服务器只管读这样可以提升整体性能.   原理图 从上图可以看出同步是靠log文件同步读写完成的.   2.更改配置文件   两天机器都操作确保 server-id 要不同通常主ID要小

详解MySQL的主从复制、读写分离、备份恢复_Mysql

一.MySQL主从复制 1.简介 我们为什么要用主从复制 主从复制目的 可以做数据库的实时备份保证数据的完整性 可做读写分离主服务器只管写从服务器只管读这样可以提升整体性能. 原理图 从上图可以看出同步是靠log文件同步读写完成的. 2.更改配置文件 两天机器都操作确保 server-id 要不同通常主ID要小于从ID.一定注意. # 3306和3307分别代表2台机器 # 打开log-bin,并使server-id不一样 #vim /data/3306/my.cnf log-bin = /da

Oracle中的游标、硬解析、软解析、软软解析、解析失败

Oracle中的游标.硬解析.软解析.软软解析.解析失败 一. 游标的分类及共享游标 游标(Cursor)是Oracle数据库中SQL解析和执行的载体,它可以分为共享游标(Shared Cursor)和会话游标(Session Cursor).共享游标可以细分为父游标(Parent Cursor)和子游标(Child Cursor),可以通过视图V$SQLAREA和V$SQL来查看当前缓存在库缓存(Library Cache)中的父游标和子游标,其中V$SQLAREA用于查看父游标,V$SQL用

Facebook、微信团队、Twitter、微软开源软件列表一览

  编者按:本文来自微信公众号"InfoQ"(ID:infoqchina),编辑小智:36氪经授权发布. 对于为什么要发布开源项目,Facebook开源项目负责人曾经解释过:一是开源能够帮助他人更快地开发软件,促进世界创新,主要是社会价值层面的考虑.二是开源能够倒逼Facebook的工程师写出更好的代码.三是开源能够更有效利用社区的力量,帮助Facebook一起解决难题.开源,让世界更美好,不是吗? Facebook开源软件列表 从Facebook的GitHub账户中可以看到,Face

JavaWeb 后端 &lt;十二&gt; 之 过滤器 filter 乱码、不缓存、脏话、标记、自动登录、全站压缩过滤器

一.过滤器是什么?有什么? 1.过滤器属于Servlet规范,从2.3版本就开始有了. 2.过滤器就是对访问的内容进行筛选(拦截).利用过滤器对请求和响应进行过滤 二.编写步骤和执行过程 1.编码步骤: a.编写一个类:实现javax.servlet.Filter接口 public class FilterDemo1 implements Filter {           public FilterDemo1(){         System.out.println("调用了默认的构造方法

JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板

一.http协议回顾: 在上一篇文章中:JavaWeb学习之Servlet(一)----MyEclipse及Tomcat的配置,我们通过在浏览器输入url,就能看到在MyEclipse中编写的Servlet资源,效果如下: 上图中,整个过程是这样的:浏览器中输入url后,会通过hosts文件/dns服务器解析为IP地址,进而找到对应ip地址的服务器. 在这期间,浏览器会通过http协议发出请求.服务器端收到请求后,做了下面这些事: (1)分析出当前请求的是哪台虚拟主机: 查看Host请求头分析出

MySQL · 源码分析 · InnoDB LRU List刷脏改进之路

之前的一篇内核月报MySQL · 引擎特性 · InnoDB Buffer Pool 中对InnoDB Buffer pool的整体进行了详细的介绍.文章已经提到了LRU List以及刷脏的工作原理.本篇文章着重从MySQL 5.7源码层面对LRU List刷脏的工作原理,以及Percona针对MySQL LRU Flush的一些性能问题所做的改进,进行一下分析. 在MySQL中,如果当前数据库需要操作的数据集比Buffer pool中的空闲页面大的话,当前Buffer pool中的数据页就必须

从B树、B+树、B*树谈到R树

转自:http://blog.csdn.net/v_JULY_v/article/details/6530142/ 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由weedge完成,R 树部分由Frankie完成,全文最终由July统稿修订完成. 出处:http://blog.csdn.net/v_JULY_v .   第一节.B树.B+树.B*树 1.前言: 动态查找树主要有:二叉查

MySQL 查询索引的选择性、索引字段、注释等基本信息的SQL

链接:http://blog.itpub.net/28602568/viewspace-1819474/ 标题: MySQL 查询索引的选择性.索引字段.注释等基本信息的SQL 作者:lōττéry版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.] 如下sql 用于统计mysql数据库非系统db的全部表/索引信息  (包括:数据库.表名.表注释.表行数.表大小.索引名.索引字段.字段注释.基数.选择性比.索引类型..) SQL:      SELECT t.table_sc