婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 淺析MySQL的lru鏈表

淺析MySQL的lru鏈表

熱門標簽:云南語音外呼系統平臺 房產智能外呼系統品牌 天智外呼系統 400電話鄭州申請 沃克斯電梯外呼線路圖 地圖標注被騙三百怎么辦 福州呼叫中心外呼系統哪家好 北京人工外呼系統價錢 常州電銷外呼系統一般多少錢

一、簡述傳統的LRU鏈表

LRU:Least Recently Used

相信大家對LRU鏈表是不陌生的,它算是一種基礎的數據結構吧,而且想必面試時也被問到過什么是LRU鏈表,甚至是讓你手寫一個LRU鏈表。

如果你讀了上一篇:你有沒有搞混查詢緩存和BufferPool?談談看!

想必你已經知道了MySQL的Buffer Pool機制以及MySQL組織數據的最小單位是數據頁。并且你也知道了 數據頁在Buffer Pool中是以LRU鏈表的數據結構組織在一起的。

其實所謂的LRU鏈表本質上就是一個雙向循環鏈表,如下圖:

下面我們結合LRU鏈表和數據頁機制描述一下MySQL加載數據的機制:

我們將從磁盤中讀取的數據頁稱為young page,young page會被直接放在鏈表的頭部。已經存在于LRU鏈表中數據頁如果被使用到了,那么該數據頁也被認為是young page而被移動到鏈表頭部。這樣鏈表尾部的數據就是最近最少使用的數據了,當Buffer Pool容量不足,或者后臺線程主動刷新數據頁時,就會優先刷新鏈表尾部的數據頁。

二、傳統LRU鏈表的不足

相信你之前肯定聽說過操作系統級別的空間局部性原理:

spatial locality(空間局部性):也就是說讀取一個數據,在它周圍內存地址存儲的數據也很有可能被讀取到,于是操作系統會幫你預讀一部分數據。

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

  1. 當Buffer Pool中存儲著一個區中13個連續的數據頁時,你再去這個區里面讀取,MySQL就會將這個區里面所有的數據頁都加載進Buffer Pool中的LRU鏈表中。(然后可能你根本不會使用這些被預讀的數據頁)
  2. 當你順序的訪問了一個區中大于 innndb_read_ahead_threshold=56個數據頁時,MySQL會自動幫你將下一個相鄰區中的數據頁讀入LRU鏈表中。(這個機制默認是被關閉的)
  3. 當你執行select * from xxx;時,如果表中的數據頁非常多,那這些數據頁就會一一將Buffer Pool中的經常使用的緩存頁擠下去,可能留在LRU鏈表中的全部是你不經常使用的數據。

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

三、MySQL的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鏈表有很大的優勢

四、MySQL定制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鏈表頭部去的。

以上就是淺析MySQL的lru鏈表的詳細內容,更多關于MySQL lru鏈表的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Mysql臟頁flush及收縮表空間原理解析
  • 推薦幾款MySQL相關工具
  • MySQL的查詢緩存和Buffer Pool
  • 淺析MySQL的基數統計
  • mysql 遞歸查找菜單節點的所有子節點的方法
  • MySQL的表空間是什么
  • MySQL慢查詢如何定位詳解
  • MySQL的Flush-List和臟頁的落盤機制

標簽:鹽城 徐州 移動 黔東 拉薩 沈陽 沈陽 珠海

巨人網絡通訊聲明:本文標題《淺析MySQL的lru鏈表》,本文關鍵詞  淺析,MySQL,的,lru,鏈表,淺析,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺析MySQL的lru鏈表》相關的同類信息!
  • 本頁收集關于淺析MySQL的lru鏈表的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 和硕县| 徐汇区| 电白县| 武川县| 略阳县| 花莲市| 武威市| 聂拉木县| 衡水市| 保德县| 六盘水市| 庄河市| 长丰县| 隆化县| 右玉县| 富民县| 桐梓县| 昌平区| 长海县| 高清| 通山县| 堆龙德庆县| 莱芜市| 无锡市| 岳阳县| 云和县| 大余县| 鄂托克旗| 雷州市| 双流县| 大英县| 景宁| 全州县| 河间市| 温州市| 英德市| 武定县| 陆河县| 确山县| 河曲县| 嘉峪关市|