mysql 原理 ~ LRU 算法與buffer_pool


一 簡介:針對查詢和事務的頁在內存中的處理,是如何進行的

二 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   臟頁的大小

 

           

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM