你知道MySQL的LRU鍊錶嗎?

2021-10-12 01:35:25 字數 3194 閱讀 3934

相信大家對lru鍊錶是不陌生的,算是一種基礎的資料結構!

lru:least recently used

lru:least recently used

相信大家對lru鍊錶是不陌生的,它算是一種基礎的資料結構吧,而且想必面試時也被問到過什麼是lru鍊錶,甚至是讓你手寫乙個lru鍊錶。

想必你已經知道了mysql的buffer pool機制以及mysql組織資料的最小單位是資料頁。並且你也知道了 資料頁在buffer pool中是以lru鍊錶的資料結構組織在一起的。

其實所謂的lru鍊錶本質上就是乙個雙向迴圈鍊錶,如下圖:

下面我們結合lru鍊錶和資料頁機制描述一下mysql載入資料的機制:

我們將從磁碟中讀取的資料頁稱為young page,young page會被直接放在鍊錶的頭部。已經存在於lru鍊錶中資料頁如果被使用到了,那麼該資料頁也被認為是young page而被移動到鍊錶頭部。這樣鍊錶尾部的資料就是最近最少使用的資料了,當buffer pool容量不足,或者後台執行緒主動重新整理資料頁時,就會優先重新整理鍊錶尾部的資料頁。

相信你之前肯定聽說過作業系統級別的空間區域性性原理:

mysql也是存在存在預讀機制的!

當buffer pool中儲存著乙個區中13個連續的資料頁時,你再去這個區裡面讀取,mysql就會將這個區裡面所有的資料頁都載入進buffer pool中的lru鍊錶中。(然後可能你根本不會使用這些被預讀的資料頁)

當你順序的訪問了乙個區中大於innndb_read_ahead_threshold=56個資料頁時,mysql會自動幫你將下乙個相鄰區中的資料頁讀入lru鍊錶中。(這個機制預設是被關閉的)

當你執行select * from ***;時,如果表中的資料頁非常多,那這些資料頁就會一一將buffer pool中的經常使用的快取頁擠下去,可能留在lru鍊錶中的全部是你不經常使用的資料。

綜上你可以看到,所謂的預讀機制的優勢,實際上違背了lru去實現將最近最少使用的資料頁刷入磁碟的設計初衷。

接下來我們看下mysql的buffer pool是如何定製lru鍊錶的,已經lru幫innodb解決了什麼問題。

當業務進行大量的crud時,需要不斷的將資料頁讀取到buffer pool中的lru鍊錶中。

mysql的lru鍊錶長下面這樣。

lru鍊錶被midpoint分成了new sublist和old sublist兩部分。

其中new sublist大概佔比5/8,old sublist佔比3/8。

new sublist儲存著young page,而old sublist儲存著old page。

我們可以通過如下的方式檢視midpoint的預設值。

使用者可以根據自己的業務動態的調整這個引數!

這其實是一種冷熱資料分離設計思想。他相對於傳統的lru鍊錶有很大的優勢而對於mysqllru鍊錶來說,通過midpoint將鍊錶分成兩部分。

從磁碟中新讀出的資料會放在old sublist的頭部。這樣即使你真的使用select * from t;也不會導致new sublist中的經常被訪問的資料頁被刷入磁碟中。

正常情況下,訪問old sublist中的快取頁,那麼該快取頁會被提公升到new sublist中成為熱資料。

但是當你通過select * from t將一大批資料載入到old sublist時,然後在不到1s內你又訪問了它,那在這段時間內被訪問的快取頁並不會被提公升為熱資料。 這個1s由引數innodb_old_blocks_time控制。

另外:new sublist也是經過優化的,如果你訪問的是new sublist的前1/4的資料,他是不會被移動到lru鍊錶頭部去的。

1、談談mysql中基數是什麼?

2、聊聊什麼是慢查?如何監控?如何排查?

3、對not null欄位插入null值有啥現象?

4、能談談year、date、datetime、time、timestamp的區別嗎?

5、你有沒有搞混查詢快取和buffer pool?談談看!

參考:

大家常說的基數是什麼?(已發布)

講講什麼是慢查!如何監控?如何排查?(已發布)

對notnull欄位插入null值有啥現象?(已發布)

能談談 date、datetime、time、timestamp、year的區別嗎?(已發布)

了解資料庫的查詢快取和bufferpool嗎?談談看!(已發布)

你知道資料庫緩衝池中的lru-list嗎?(已發布)

談談資料庫緩衝池中的free-list?(已發布)

談談資料庫緩衝池中的flush-list?(已發布)

了解髒頁刷回磁碟的時機嗎?(已發布)

用十一張圖講清楚,當你crud時bufferpool中發生了什麼!以及bufferpool的優化!(已發布)

聽說過錶空間沒?什麼是表空間?什麼是資料表?(已發布)

談談mysql的:資料區、資料段、資料頁、資料頁究竟長什麼樣?了解資料頁**嗎?談談看!(已發布)

談談mysql的行記錄是什麼?長啥樣?(已發布)

了解mysql的行溢位機制嗎?(已發布)

說說fsync這個系統呼叫吧! (已發布)

簡述undo log、truncate、以及undo log如何幫你回滾事物! (已發布)

我勸!這位年輕人不講mvcc,耗子尾汁! (已發布)

mysql的崩潰恢復到底是怎麼回事? (已發布)

mysql的binlog有啥用?誰寫的?在**?怎麼配置 (已發布)

mysql的bin log的寫入機制 (已發布)

面試官都關注了!你還在猶豫什麼呢?

你知道dB的來歷嗎?

你知道db的來歷嗎?想必大家都在中學的時候就接觸過db這個概念了,可能都知道計算db的方法,就是10lg p1 p2 可是,你知道它的來歷嗎?它為什麼叫db呢?話說 db是由alexander graham bell,這個發明了 的人首創的。他是個外科醫生,以研究和資料有聽力障礙的兒童為職業生涯的開...

linuxkernel的LRU鍊錶操作

在linux核心list.h中包含了關於lru鍊錶的很多操作,可以方便呼叫。在此總結如下。linux版本為4.3 一 初始化 1.初始化煉表頭 a list head name b init list head struct list head list 二 新增 1.在煉表頭新增 list add...

UE UI UCD UED?你知道你是幹啥的嗎

ui user inte ce 即使用者介面,也稱人機介面。是指使用者和某些系統進行互動方法的集合,這些系統不單單指電腦程式,還包括某種特定的機器,裝置,複雜的工具等。ue或ux就是使用者體驗 user experience 指的是使用者使用乙個產品 服務 時的所有體驗與心情感受,包含對於設計風格的...