相信大家對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 指的是使用者使用乙個產品 服務 時的所有體驗與心情感受,包含對於設計風格的...