开发者社区> miles_wong> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

innodb lru list、free list、flush list

简介: LRU list innodb中新读取到的页,并不直接放在LRU列表首部,而是放在midpoint位置。默认该位置在LRU列表5/8处。midpoint可有参数innodb_old_blocks_pct控制 mysql> show variables lik...
+关注继续查看

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;

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
在Flutter里实现一个开心农场地块布局!Web前端工程师也可以看看,作为Flutter入门。
为避免贴大段代码,文中代码部分仅作为参考,并非全部代码,请理解后自行补全或者下载源码进行学习。
35 0
Flutter 101: 何为 Flutter Elements ?
0 基础学习 Flutter,第一百零一步:简单了解一下 Element 原理!
231 0
基于ECS快速搭建FTP服务器 笔记
阿里云七天打卡 day1 笔记
568 0
InnoDB buffer pool flush 策略
### InnoDB buffer pool flush 策略 **1. 刷脏整体策略** 首先从整体上来说, 刷脏的coordinator_thread 会判断进入哪一种场景刷脏 在 buf_flush_page_coordinator_thread() 函数里面 刷脏主要有3个场景 1. 如果 buf_flush_sync_lsn > 0, 则因为r
402 0
浅谈跨平台框架 Flutter 的搭建与运行
作者:个推iOS开发工程师 伊泽瑞尔 Flutter是Google推出的跨平台的解决方案,用以帮助开发者在 Android 和 iOS 两个平台开发高质量原生应用的全新移动 UI 框架。 之前我们为大家介绍了《跨平台框架Flutter的优势与结构》,概括了Flutter选择Dart语言的必要性及其自底而上的框架结构,大家可以点击标题链接来回顾前文。
2126 0
[InnoDB 源码介绍] lock-free redo log in mysql8.0
InnoDB 和大部分的存储引擎一样, 都是采用WAL 的方式进行写入数据, 所有的数据都先写入到redo log, 然后后续再从buffer pool 刷脏到数据页 又或者是备份恢复的时候从redo log 恢复到buffer poll, 然后在刷脏到数据页, WAL很重要的一点是将随机写转换成了顺序写, 所以在机械磁盘时代, 顺序写的性能远远大于随机写的背景下, 充分利用了磁盘的性能.
781 0
实操《深入浅出React和Redux》第二期--Flux
此书讲得蛮详细, 从Flux一步一步过渡到Redux。 写过的代码舍不得扔, 立此存照吧。
2439 0
free rainbow tables
http://freerainbowtables.mirror.garr.it/mirrors/freerainbowtables/md5/ ...
549 0
+关注
miles_wong
Java核心技术 数据存储与数据库 分布式系统与计算 系统研发与运维 编程语言
87
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载