MySQL InnoDB體系架構之記憶體,mysqlinnodb

來源:互聯網
上載者:User

MySQL InnoDB體系架構之記憶體,mysqlinnodb

1.緩衝池
    InnoDB儲存引擎是基於磁碟儲存的,並將其中的記錄按照頁的方式進行管理。通常使用緩衝池來提高資料庫的整體效能。緩衝池簡單說就是一塊記憶體,通過記憶體的速度彌補磁碟速度較慢對資料庫效能的影響。在資料庫中進行讀操作時,首先將從磁碟讀到的頁存放在緩衝池中,下一次讀取相同的頁時,首先判定是否存在緩衝池中,如果有就是被命中直接讀取,沒有的話就從磁碟中讀取。在資料庫進行改操作時,首先緩衝池中的頁,然後在以一定的頻率重新整理到磁碟上。這裡的重新整理機制不是每頁在發生變更時觸發。而是通過一種checkpoint機制重新整理到磁碟的。可以通過innodb_buffer_pool_size(單位塊)參數來設定緩衝池的大小。緩衝池中的資料庫類型有:索引頁、資料頁、undo頁、插入快取頁面(insert buffer)、自適應hash(adaptive hash index)、innodb儲存的鎖資訊(lock info)、資料字典資訊(data dictionary)。通過參數innodb_buffer_pool_instances設定允許有多個緩衝池執行個體,每個頁根據雜湊值平均分配到不同的執行個體中,以減少資料庫內部資源的競爭,增加資料庫的並發處理能力。
2.LRU List、Free List和Flush List
    innoDB儲存引擎的緩衝池是通過LRU演算法來進行管理的,即最頻繁使用的頁在LRU列表(管理已經讀取到的頁)的前段,最少使用的頁在LRU列表的尾端。緩衝池中每頁大小16K。但是它對LRU演算法做了一些最佳化,加入了midpoint位置。新擷取的資料放入midpoint,而不是放入列表頭部。通常midpoint在LRU列表的5/8處。可以通過innodb_old_blocks_pct參數來設定。把midpoint之後的列表稱為old列表,之前的稱為new列表。為什麼在innoDB儲存引擎採用midpoint呢?這是因為如直接將讀取到的也放入LRU的首端,某些SQL操作導致緩衝池中的頁被刷出,從而影響緩衝池的效率。可以通過參數innodb_old_blocks_time設定頁讀取到midpoint位置後需要等待多久才會加入LRU的new列表。

    當資料庫剛啟動時,LRU列表是空的,這時所有的頁都放在Free列表中的。當需要從緩衝池中分配頁時,首先從Free列表中查看是否有閒置空閑頁,若有則從Free列表中刪除然後加入到LRU列表中。否則根據LRU演算法,淘汰LRU列表末尾的頁,將該記憶體空間分配給新的頁。當頁從LRU的old部分加入到new部分,此時發生的操作是page made young,而因為innodb_old_blocks_time參數的設定導致頁沒有從old加入到new的操作稱為page not made young。從InnoDB儲存引擎1.0.X版本開始支援壓縮頁的功能。即將原來16K的頁壓縮為1K、2K、4K和8K,由於頁的大小發生變化,LRU列表頁有相應的變化,對於非16K的頁時通過unzip_LRU列表進行維護。在LRU列表中的頁被修改後,該頁稱為髒頁(dirry page),這時資料庫通過checkpoint機制將髒頁刷回磁碟。而Flush列表中的頁就是髒頁列表。髒頁即存在於LRU列表頁存在於Flush列表。LUR列表用來管理緩衝池中頁的可用性,Flush列表用來管理將也刷回磁碟。可以通過show engine innodb status命令來查看LRU列表和Free列表的使用方式和運行狀態。

    由圖可以看出:

       Buffer pool size總共有8191個頁(8191*16k);

       Free buffers表示當前Free列表中的頁的數量;

       Datebase pages表示LRU列表中頁的數量。可能Free buffers和Database pages之和不等於Buffer pool size。這是因為緩衝池中的也還可能會被分配給自適應雜湊索引、lock資訊、insert buffer等頁。而這部分是不需要LRU演算法維護的,因此不在LRU列表中。

       page made young表示LRU列表中頁移動到前段的次數。

       Buffer pool hit rate表示緩衝池的命中率,該值不能小於95%。

       LRU len表示LRU列表中有多少頁。

      unzip_LRU len表示壓縮的頁數;其中LRU len包含unzip_LRU len。Modified db pages表示當前髒頁的數量。

還可以通過  information_schema.INNODB_BUFFER_PAGE_LRU表來觀察LRU列表中每個頁的具體資訊。

3.重做日誌緩衝(redo log buffer)
    innoDB儲存引擎首先將重做日誌資訊放入這個緩衝區,然後按照一定的頻率將其刷入重做記錄檔中。重做日誌緩衝區一般不需要很多,只要保證每秒產生的事務量在這個緩衝大小之內即可。可以通過innodb_log_buffer_size參數設定大小。

4.額外的記憶體池
    在innoDB儲存引擎中,對記憶體的管理是通過一種稱為記憶體堆(heap)的方式進行。在對一些資料結構本身的記憶體進行分配時,需要從額外的記憶體池中進行申請,當該地區的記憶體不夠時,需要從緩衝池中申請。例如L:分配了緩衝池,但是每個緩衝池中的幀緩衝(frame buffer)還有對應的緩衝控制對象(buffer control block),這些記錄了一些諸如LRU、鎖、等待等資訊,而這個對象的記憶體就需要從額外記憶體池中申請。因此在申請了很大的緩衝池是也要考慮相應增加這個值。


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.