首页 > 解决方案 > MySQL 如何从缓冲池中逐出页面?

问题描述

我正在尝试了解 MySQL 的内部结构。我知道 MySQL 的缓冲池管理有一个旧/新页面列表,如此处所示。而且我确实知道旧脏页的刷新,例如here以及如何自定义here。我也知道 MySQL 使用 LRU 算法进行页面驱逐,如此

但是,是否有一个缓冲池守护程序/线程驱逐只读页面(不是脏页面),这些页面是通过 select 语句带到缓冲池的?有没有办法自定义它(例如,当我通过 95% 的缓冲池容​​量时,开始逐出读取页面或刷新脏页)。换句话说,LRU 算法中的哪些触发器从缓冲池中逐出页面(例如,页面在缓冲池上的时间、缓冲池填充的百分比、需要逐出页面以加载新页面),这些是可调整的吗?

标签: mysqlcachingbufferevict

解决方案


冲洗和驱逐是完全不同的。

https://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_flush

MySQL 会按照 innodb_max_dirty_pages_pct 刷新脏页。InnoDB 中的默认数据库页面大小默认为 16KB,innodb_max_dirty_pages_pct 的最大设置为 99,因此对于脏页的构建没有太大的容忍度(尽管,正如您从链接中知道的那样,您引用了实际的刷新时间表计算有点复杂)。

在它们被刷新之后,当它们是 LRU 时,它们将被逐出。

MySQL 使用 LRU 和“中点插入策略”方法。https://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_midpoint_insertion_strategy


推荐阅读