mysql存储引擎层如何读取数据页_mysql页读取与缓存逻辑

落枫君_4768

落枫君_4768

2026-05-15

914人浏览

原创

innodb通过buf_page_get_gen()函数实现数据页加载:先查buffer pool,未命中则调fil_io()异步读取16kb整页;满时按lru淘汰,young/old分区防污染;物理读才是性能瓶颈,高命中率掩盖i/o压力;预读分线性和随机两种,线性需连续13页顺序访问才触发;checksum校验失败直接报错中止查询。

mysql存储引擎层如何读取数据页_mysql页读取与缓存逻辑

MySQL 读数据页时,InnoDB 怎么从磁盘加载到 buffer pool

InnoDB 不是每次查记录都直接读磁盘,而是先查 buffer pool;没命中才触发「物理读」——即从磁盘读取一个完整的 16KB 数据页(page)进内存。

这个过程由 buf_page_get_gen() 函数驱动,它会按顺序检查:是否已在 buffer pool 中 → 是否在 LRU list 里 → 若不在,就调用 fil_io() 发起异步 I/O 读取对应 space_id 和 page_no 的页。

  • 页加载是「整页加载」,哪怕只查一行,也要把整个 16KB 页拉进来
  • 如果 buffer pool 已满,会按 LRU 策略淘汰冷页,但有 young_list/old_list 分区避免全表扫描污染热数据
  • innodb_old_blocks_pct 默认 37,影响新页进入 old 区的比例,调太低会导致预读页过早被踢出

为什么 SELECT 有时慢得离谱,但 SHOW ENGINE INNODB STATUS 却显示 buffer pool 命中率 99%

高命中率只说明「逻辑读」多,掩盖了底层的物理读压力。真正卡顿往往发生在第一次访问某页时的磁盘 I/O,尤其是随机 I/O 场景下,机械盘寻道延迟明显。

常见诱因:ORDER BY 配合无索引字段、LIMIT 跳过大量偏移、或 JOIN 导致非顺序访问多个分散页。

  • 用 SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads' 看真实物理读次数,比命中率更有参考价值
  • Innodb_data_reads 是操作系统层面的 read() 调用次数,含预读页,通常大于前者
  • SSD 可缓解但不消除问题——页定位、解析、校验(innodb_checksum_algorithm)仍需 CPU 时间

预读(read-ahead)什么时候触发?怎么判断是不是它在捣鬼

InnoDB 在检测到连续访问模式时会主动预读后续页,分两种:线性预读(linear read-ahead)和随机预读(random read-ahead),后者已从 5.7+ 默认禁用。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载

线性预读条件苛刻:当前页所在 extent 内,连续 13 个页被访问过,且都是顺序请求,才会触发读取剩余 32 页。所以不是“一读就预读”,更不是“所有范围查询都预读”。

  • 可通过 SHOW ENGINE INNODB STATUS 中的 Pages read ahead 字段确认是否发生
  • 误判常出现在大批量 SELECT ... LIMIT 10000,10 场景——看似顺序,实则跳过大量页,触发无效预读并挤占 buffer pool
  • 关闭线性预读:设置 innodb_read_ahead_threshold=0,但别在 OLTP 核心库轻易动,可能加重单页 I/O

page checksum 失败后,InnoDB 怎么处理损坏页

页加载进 buffer pool 后,InnoDB 会立即校验 checksum(默认 crc32)。校验失败不会静默忽略,而是抛出错误并中止查询,日志里出现 Database page corruption 或 invalid page in log。

注意:这发生在「页加载后、解析前」,所以即使 SQL 语法完全正确,也可能因底层页损坏而报错。

  • 若 innodb_force_recovery > 0,部分校验会被跳过,但风险极高,仅用于紧急导出
  • innodb_checksum_algorithm=strict_crc32 比默认值更严格,能提前暴露存储层写异常
  • 云上环境要特别留意:某些虚拟块设备或快照链路可能静默损坏页尾部,导致 checksum 不匹配

页级加载和校验是 InnoDB 最底层的数据可信边界,任何绕过它的“修复”操作(比如直接 dd 替换页)都会让后续事务状态不可预测。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2313

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1419

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

835

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3232

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5508

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1219

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5771

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

5022

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6714

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 189人学习