欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析MySQL的lru鏈表

 更新時間:2020年11月27日 11:07:42   作者:賜我白日夢  
這篇文章主要介紹了MySQL lru鏈表的相關(guān)資料,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下

一、簡述傳統(tǒng)的LRU鏈表

LRU:Least Recently Used

相信大家對LRU鏈表是不陌生的,它算是一種基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)吧,而且想必面試時也被問到過什么是LRU鏈表,甚至是讓你手寫一個LRU鏈表。

如果你讀了上一篇:你有沒有搞混查詢緩存和BufferPool?談?wù)効矗?/a>

想必你已經(jīng)知道了MySQL的Buffer Pool機制以及MySQL組織數(shù)據(jù)的最小單位是數(shù)據(jù)頁。并且你也知道了 數(shù)據(jù)頁在Buffer Pool中是以LRU鏈表的數(shù)據(jù)結(jié)構(gòu)組織在一起的。

其實所謂的LRU鏈表本質(zhì)上就是一個雙向循環(huán)鏈表,如下圖:

下面我們結(jié)合LRU鏈表和數(shù)據(jù)頁機制描述一下MySQL加載數(shù)據(jù)的機制:

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

二、傳統(tǒng)LRU鏈表的不足

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

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

MySQL也是存在存在預(yù)讀機制的!

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

綜上你可以看到,所謂的預(yù)讀機制的優(yōu)勢,實際上違背了LRU去實現(xiàn)將最近最少使用的數(shù)據(jù)頁刷入磁盤的設(shè)計初衷。

三、MySQL的LRU鏈表

接下來我們看下MySQL的Buffer Pool是如何定制LRU鏈表的,已經(jīng)LRU幫InnoDB解決了什么問題。

當業(yè)務(wù)進行大量的CRUD時,需要不斷的將數(shù)據(jù)頁讀取到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的默認值。

用戶可以根據(jù)自己的業(yè)務(wù)動態(tài)的調(diào)整這個參數(shù)!

這其實是一種冷熱數(shù)據(jù)分離設(shè)計思想。他相對于傳統(tǒng)的LRU鏈表有很大的優(yōu)勢

四、MySQL定制LRU鏈表的優(yōu)勢
而對于MySQLLRU鏈表來說,通過MidPoint將鏈表分成兩部分。

從磁盤中新讀出的數(shù)據(jù)會放在Old Sublist的頭部。這樣即使你真的使用select * from t;也不會導(dǎo)致New Sublist中的經(jīng)常被訪問的數(shù)據(jù)頁被刷入磁盤中。

正常情況下,訪問Old Sublist中的緩存頁,那么該緩存頁會被提升到New Sublist中成為熱數(shù)據(jù)。

但是當你通過 select * from t 將一大批數(shù)據(jù)加載到Old Sublist時,然后在不到1s內(nèi)你又訪問了它,那在這段時間內(nèi)被訪問的緩存頁并不會被提升為熱數(shù)據(jù)。 這個1s由參數(shù)innodb_old_blocks_time控制。

另外:New SubList也是經(jīng)過優(yōu)化的,如果你訪問的是New SubList的前1/4的數(shù)據(jù),他是不會被移動到LRU鏈表頭部去的。

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

相關(guān)文章

  • 一篇文章帶你了解MySQL之undo日志

    一篇文章帶你了解MySQL之undo日志

    Undo日志也叫做回滾日志,是MySQL數(shù)據(jù)庫當中一種重要的日志,用于記錄更新操作之前的數(shù)據(jù)狀態(tài),這篇文章主要給大家介紹了關(guān)于如何通過一篇文章帶你了解MySQL之undo日志的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • mysql使用GROUP BY分組實現(xiàn)取前N條記錄的方法

    mysql使用GROUP BY分組實現(xiàn)取前N條記錄的方法

    這篇文章主要介紹了mysql使用GROUP BY分組實現(xiàn)取前N條記錄的方法,結(jié)合實例形式較為詳細的分析了mysql中GROUP BY分組的相關(guān)使用技巧,需要的朋友可以參考下
    2016-06-06
  • MySQL如何獲取當前時間與日期間隔

    MySQL如何獲取當前時間與日期間隔

    這篇文章主要介紹了MySQL如何獲取當前時間與日期間隔問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 總結(jié)MySQL建表、查詢優(yōu)化的一些實用小技巧

    總結(jié)MySQL建表、查詢優(yōu)化的一些實用小技巧

    本篇文章是對MySQL建表以及查詢優(yōu)化的一些實用小技巧進行了詳細的分析介紹,需要的朋友參考下
    2013-07-07
  • Mysql?刪除重復(fù)數(shù)據(jù)保留一條有效數(shù)據(jù)(最新推薦)

    Mysql?刪除重復(fù)數(shù)據(jù)保留一條有效數(shù)據(jù)(最新推薦)

    這篇文章主要介紹了Mysql?刪除重復(fù)數(shù)據(jù)保留一條有效數(shù)據(jù),實現(xiàn)原理也很簡單,mysql刪除重復(fù)數(shù)據(jù),多個字段分組操作,結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • mysql5.7.25使用全文檢索功能的實例教程

    mysql5.7.25使用全文檢索功能的實例教程

    其實全文檢索在MySQL里面很早就支持了,下面這篇文章主要給大家介紹了關(guān)于mysql5.7.25使用全文檢索功能的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • 詳解Mysql導(dǎo)出數(shù)據(jù)的幾種方式

    詳解Mysql導(dǎo)出數(shù)據(jù)的幾種方式

    MySQL導(dǎo)出數(shù)據(jù)的目的有很多種,如數(shù)據(jù)庫備份、表結(jié)構(gòu)導(dǎo)出、表數(shù)據(jù)導(dǎo)出、分析數(shù)據(jù)采取等,本文詳細的介紹了兩種Mysql導(dǎo)出數(shù)據(jù)的方法,感興趣的小伙伴可以了解一下
    2018-10-10
  • MySQL 選擇合適的存儲引擎

    MySQL 選擇合適的存儲引擎

    這篇文章主要介紹了MySQL如何選擇合適的存儲引擎,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-09-09
  • MySQL5.7.21解壓版安裝詳細教程圖解

    MySQL5.7.21解壓版安裝詳細教程圖解

    對于小編來說安裝系統(tǒng)軟件是常干的事情,今天小編抽空給大家整理了MySQL5.7.21解壓版安裝詳細教程圖解,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-09-09
  • 關(guān)于在sql中使用order by實現(xiàn)排序出錯問題

    關(guān)于在sql中使用order by實現(xiàn)排序出錯問題

    這篇文章主要介紹了關(guān)于在sql中使用order by實現(xiàn)排序出錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評論