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

歡迎訪問 生活随笔!

生活随笔

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

数据库

MySQL buffer pool中的三种链

發布時間:2025/3/19 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL buffer pool中的三种链 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

三種page、三種list、LRU控制調優

一、innodb buffer pool中的三種頁

1、free page:從未用過的頁

2、clean page:干凈的頁,數據頁的數據和磁盤一致

3、dirty page:臟頁

SQL執行需求:

  1、找free頁

  2、刷新臟頁

    1、這個頁不是熱的數據頁(刷冷頁)

    2、這個頁最早修改時間(刷修改時間比較早的頁,有可能是熱頁),方便日志文件的覆蓋

  3、覆蓋冷的clean頁

為了實現上述需求,innodb用到鏈表技術(每種鏈表一種作用,鏈的存在意義是為了遍歷)。

?

二、innodb buffer pool中的三種鏈

1、free list:將free數據頁使用鏈表鏈起來

  數據庫剛啟動的時候,lru列表為空,此時需要用到的時候直接將free列表中的頁刪除,在lru列表中增加相應的頁,維持頁數守恒。

2、lru list:根據冷熱將clean、dirty鏈起來

  least recent used(最近最少使用)

  1、“中點插入策略”

  2、回寫盡量回寫冷的臟塊

  3、覆蓋盡量覆蓋冷的臟塊

LRU標準算法:

  1)3/8的list信息是作為old list,這些信息是被驅逐的對象。

  2)list的中點就是我們所謂的old list頭部和new list尾部的連接點,相當于一個界限。

  3)新數據的讀入首先會插入到old list的頭部。

  4)如果是old list的數據被訪問到了,這個頁信息就會變成new list,變成young page,就會將數據頁信息移動到new sublist的頭部。

  5)在數據庫的buffer pool里面,不管是new sublist還是old sublist的數據如果不會被訪問到,最后都會被移動到list的尾部作為犧牲者。

3、flush list:將頁按照最早臟時間鏈起來

  flush list中的也全都是臟頁,刷盤即將flush list中的臟頁刷新回磁盤中。

  1、將非常舊的臟塊回寫到磁盤,按照新舊回寫數據頁;

  2、因為是從最早臟的塊開始刷,這樣logfile里的對應的日志就可以被覆蓋了。

Q:為什么需要這三種鏈 ?
A:

  因為在innodb 緩沖池中,內存管理如下:
  1、需要經常找 free 空閑數據塊:free list。
  2、需要經常找冷的數據塊:lru list(最近最少使用,根據冷熱鏈起來)。
  3、需要知道哪些數據塊是比較早臟的,flush list:我們要覆蓋舊的 logfile,就需要系統將這些 logfile 對應的臟塊,即將 flush list 鏈上的臟頁往磁盤上刷,(批量往磁盤寫的時候,不如刷臟頁)。

?

三、LRU冷熱區控制及調整

1、設置冷熱分界線:innodb_old_blocks_pct

2、成為熱塊的所需時間:innodb_old_blocks_time

mysql> show variables like '%old_blocks%'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | innodb_old_blocks_pct | 37 | | innodb_old_blocks_time | 1000 | +------------------------+-------+ 2 rows in set (0.01 sec)

  通過 innodb_old_blocks_pct 參數值得設定分為兩部分:一是存放長時間未被訪問的數據頁,二是存放最近被訪問的數據頁。靠近 LRU 鏈表頭部的數據頁表示最近經常被訪問,靠近尾部表示數據頁長期未被訪問,這兩個部分的交匯處稱為 midpoint,即 innodb_old_blocks_pct這個點的設置。默認是37%,最小是5,最大是95;如果內存比較大的話,可以將這個數值調低,通常會調成20,也就是說20%的是冷數據塊。目的是為了保護熱區數據不被刷出內存。

  通過innodb_old_blocks_time參數來控制成為熱數據的所需時間,默認是1000ms,也就是1s,也就是數據在1s內沒有被刷走,就調入熱區。

3、LRU冷熱數據的監控

mysql> show engine innnodb status\G …… Pages made young 0, not young 0 0.00 youngs/s, 0.00 non-youngs/s

  1、數據頁從冷到熱,稱為young;not young就是數據在沒有成為熱數據情況下就被刷走的量(累計值)。

  2、non-youngs/s,這個數值如果很高,一般情況下就是系統存在嚴重的全表掃描,自然意味著很高的物理讀。

  3、youngs/s,如果這個值相對較高,最好增加一個innodb_old_blocks_time,降低innodb_old_blocks_pct,保護熱數據

總結

以上是生活随笔為你收集整理的MySQL buffer pool中的三种链的全部內容,希望文章能夠幫你解決所遇到的問題。

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