Mysql

如果查詢讀取的頁面超過 InnoDB 緩衝區可以容納的數量,是否所有先前的頁面都被逐出?

  • July 15, 2017

如果我在 InnoDB 緩衝區中有一些(熱)頁面,並且我執行的查詢讀取的數據量大於緩衝區本身,那麼熱頁面是否一定會被驅逐?

根據MySQL 5.7 參考手冊 - InnoDB 緩衝池

InnoDB 使用最近最少使用 (LRU) 算法的變體將緩衝池作為列表進行管理。當需要空間來向池中添加新頁面時,InnoDB 會驅逐最近最少使用的頁面並將新頁面添加到列表的中間。這種“中點插入策略”將列表視為兩個子列表:

  • 在頭部,最近訪問的“新”(或“年輕”)頁面的子列表。
  • 在尾部,最近訪問較少的“舊”頁面的子列表。

該算法將查詢大量使用的頁面保留在新的子列表中。舊的子列表包含較少使用的頁面;這些頁面是驅逐的候選者。

(強調我的)

我認為這就是您正在尋找的答案。並非所有頁面都被逐出,它們一次被逐出一個,並且每次只會逐出*舊頁面。*顯然,如果查詢需要兩倍(或更多)的可用池,最終所有頁面都可能被逐出,具體取決於它們的使用頻率。

我想說靠近B+樹根的所有頁面(用於索引和表的聚集方式)將比其他頁面更頻繁地使用,因此它們不太可能被驅逐。但是,在某些情況下,只有大量的全表掃描,(可能)只通過頁面一次,最終可能會使所有熱頁面不堪重負並被驅逐。我認為這不太可能,但理論上是可能的。

引用自:https://dba.stackexchange.com/questions/179921