innodb lru list、free list、flush list

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 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;
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5天前
|
缓存 监控 算法
如何调整InnoDB的LRU算法以提高效率?
【5月更文挑战第14天】如何调整InnoDB的LRU算法以提高效率?
9 2
|
关系型数据库 MySQL
MySQL:Innodb表 Data free 的计算概要
简单记录一下,因为看了一下Data free的计算还算准确。不是统计值大概是空闲extent的大小。 ST_FIELD_INFO tables_fields_info[]= {... {"DATA_FREE", MY_INT64_NUM_DECIMAL_DIGITS, MYSQL_TYPE_L...
4460 0
|
5天前
|
关系型数据库 MySQL 数据库
MySQL谈谈InnoDB怎么解决幻读的
MySQL谈谈InnoDB怎么解决幻读的
23 2
|
5天前
|
存储 关系型数据库 MySQL
MySQL InnoDB数据存储结构
MySQL InnoDB数据存储结构
|
5天前
|
存储 关系型数据库 MySQL
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
39 0
|
3天前
|
存储 监控 关系型数据库
MySQL 参数innodb_read_io_threads
`innodb_read_io_threads` 是 MySQL 数据库中 InnoDB 存储引擎的一个配置参数,它用于指定后台线程池中用于处理读取 I/O 请求的线程数量。InnoDB 存储引擎负责管理数据库的物理存储和检索,是 MySQL 最常用的存储引擎之一。 ### 参数说明 - **名称**: `innodb_read_io_threads` - **默认值**: 4 - **范围**: 1 到 64 - **动态修改**: 不能动态修改(需要重启服务器) - **适用版本**: MySQL 5.6 及以上版本 ### 作用 `innodb_read_io_threads`
|
5天前
|
运维 负载均衡 关系型数据库
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构