mysql - MySQL 中 ib_buffer_pool 文件的语义

标签 mysql innodb

MySQL 的默认存储引擎 InnoDB 维护着一个数据库页面的内部缓冲池。在较新版本的 MySQL(例如 5.7+)中,缓冲池中页面的空间和页面 ID 持久保存到磁盘的“ib_buffer_pool”文件中。

我很好奇这个文件是如何构建的,特别是如果缓冲池中页面的相对新旧度在重启后仍然存在。换句话说,如果池中的某些页面比其他页面更年轻,在将文件写入磁盘然后从磁盘读取之后,这种关系是否成立?

一个更广泛的问题如下:有多少 InnoDB 缓冲池的状态在重启后持续存在?

最佳答案

你问的大部分内容都无关紧要。

该文件包含指针,而不是数据 block 。每个“指针”可能包含表空间 ID(ibdata1 与单个 .ibd 文件)和 block 号。包含 LRU 信息会很方便,但并非绝对必要。

目标是在重启后快速重新填充基于 RAM 的“缓冲池”。缓冲池是一个缓存;过去是根本没有重新加载。在正常事件期间,缓冲池中的 block 是基于(某种程度上)“最近最少使用”来组织的。这有助于防止“过早”出 block 。

如果所有 block 指针 在关闭之前都存储在该文件中,那么缓冲池可以基本上恢复到原来的位置。在重新启动时,这需要一些磁盘事件,但在那之后,每个查询都应该像没有发生重新启动一样快。

如果,由于某种原因,一些 block 被不恰本地重新加载,这将是一个轻微的性能损失,但没有什么是“错误的”。该 block 很快就会被撞出缓冲池。

有多少状态在重启后仍然存在?嗯,绝对的要求是保持数据库中数据的完整性——即使是在电源故障的情况下。除此之外的任何事情都只是性能优化。因此,要完全回答这个问题,需要了解 iblog*(崩溃后需要;干净关机后不需要)、新的 tmp 表文件(不需要)、“双缓冲区”(用于从“损坏的页面”中恢复) '突然崩溃后)等

关于mysql - MySQL 中 ib_buffer_pool 文件的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41784947/

相关文章:

php - 在我的数组中使用 INSERT INTO 的正确方法

php - SQL如何让所有图像显示各自的单位

php - 无法更新 InnoDb 中的数据库

php - 使用 WHERE IN 或 join 进行双重查询

php - 在 HTML 表中显示 10 个最近的数据库条目

mysql - 查询以选择当前和之前的小时、日期和月份

php - 试图区分包含数据的 $query 响应和不包含数据的 $query 响应

MySQL InnoDB 大表的 INSERT 性能

php - 如何避免多对多查询中的 "Using temporary"?

Mysql innodb 压缩没有给出正确的结果