我试图了解 MySQL 的内部结构。我知道 MySQL 的缓冲池管理有一个旧/新页面列表,如此处所示。而且我确实知道旧的脏页的刷新,比如这里解释的以及如何在这里自定义它。我也知道 MySQL 使用 LRU 算法进行页面驱逐,如下所示。
但是,是否有一个缓冲池守护进程/线程可以驱逐通过 select 语句带到缓冲池的只读页面(不是脏页)?有没有办法自定义它(例如,当我通过 95% 的缓冲池容量时,开始驱逐读取的页面或刷新脏页)。换句话说,LRU 算法中的什么触发器从缓冲池中逐出页面(例如,页面在缓冲池中的时间、缓冲池填充的百分比、需要逐出页面以加载新页面),这些是否可调?
冲洗和驱逐是完全不同的。
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 时被驱逐。
文档指出,“当需要空间将新页面添加到缓冲池时”。所以我想它会等到它快满了。关于 LRU 的一般特征,您可以在其他地方阅读它,因为它不是 MySQL 特定的。然而,MySQL 确实使用“中点插入策略”,这使得事情不是真正的 LRU,以便降低多余页面的优先级。
https://dev.mysql.com/doc/refman/5.5/en/glossary.html#glos_midpoint_insertion_strategy