天天看點

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裡的對應的日志就可以被覆寫了。

MySQL buffer pool中的三種鍊

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,保護熱資料。

@author:http://www.cnblogs.com/geaozhang/