日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql冷热数据LRU_浅析MySQL的lru链表

發布時間:2024/9/27 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql冷热数据LRU_浅析MySQL的lru链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、簡述傳統的lru鏈表

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容量不足,或者后臺線程主動刷新數據頁時,就會優先刷新鏈表尾部的數據頁。

二、傳統lru鏈表的不足

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

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

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

當buffer pool中存儲著一個區中13個連續的數據頁時,你再去這個區里面讀取,mysql就會將這個區里面所有的數據頁都加載進buffer pool中的lru鏈表中。(然后可能你根本不會使用這些被預讀的數據頁)

當你順序的訪問了一個區中大于 innndb_read_ahead_threshold=56個數據頁時,mysql會自動幫你將下一個相鄰區中的數據頁讀入lru鏈表中。(這個機制默認是被關閉的)

當你執行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冷热数据LRU_浅析MySQL的lru链表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。