一 簡介:針對查詢和事務的頁在內存中的處理,是如何進行的
二 LRU算法
普通 : 實現的是末尾淘汰法,當整個鏈表已滿時,淘汰尾部,將新的數據頁加入頭部
mysql_lru改進 : 分為兩部分 1分為 yang和old,並不從LRU列表頭部進行插入,而是從中間部位.對過期頁實行末尾淘汰沒有問題,
2 針對新插入的數據頁需要做二次判斷
1 如果數據頁保持1S以上時間,則推進到yang頭部
2 如果數據頁不能保持1S,則依然保留到old區,等待被淘汰
改進優點:防止一次性的大查詢讀取的數據頁污染整個LRU列表,影響整體的事務命中率
三 相關參數
1 innodb_old_blocks_time 控制着判斷數據頁保持時間,是加入yang還是保留在old區,默認1s,防止單次大量的全表掃描污染整個LRU
2 innodb_max_dirty_pages_pct 控制着頁插入的位置,默認為50%, yang和old區的百分比
四 計算公式
innodb buffer pool命中率
1 Innodb_buffer_pool_read_requests表示read請求的次數
2 Innodb_buffer_pool_reads表示從物理磁盤中讀取數據的請求次數
innodb buffer的read命中率就可以這樣得到:(Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100%。一般來講這個命中率不會低於99%,如果低於這個值的話就要考慮加大innodb buffer pool。
通過 innodb_buffer_pool_stats 可以直接查看命中率,並不需要計算
五 相關補充
Free List 數據庫剛啟動的時候,LRU 列表為空,此時需要用到的時候直接將Free列表中的頁刪除,在LRU列表中增加相應的頁,維持頁數守恆。
Flush List 當LRU列表中的頁被修改后,稱該頁為臟頁(dirty page),即緩沖池中的頁和磁盤上的頁數據產生了不一致。這時候數據庫會通過checkpoint機制將臟頁刷新回磁盤,而Flush 列表中的頁即為臟頁列表。注意臟頁也存在於LRU列表中。
INNODB_BUFFER_POOL 構成 1 數據頁 2 索引頁 3 字典 4 鎖信息 5 AHI 6 插入緩沖
六 相關監控
命令 show engine innodb status
相關參數
1 BUFFE POOL SIZE 整個innodb_buffer_pool 頁的總數大小 計算總量X16K即可
2 Free buffers 當前Free列表中頁的數量
3 Datebase pages LRU列表中數據頁的個數
這里注意 通常 Datebase pages+Free buffers 並不等於 整個buffer_pool頁的數量。因為還有其他需要頁 (數據字典,鎖)等,這部分是不歸LRU列表進行維護的
4 Modified db pages 臟頁的大小