MySQL--InnoDB 體系架構

InnoDB 體系架構

後臺線程

 

Master Thread

  Master Thread 是一個很是核心的後臺線程,主要負責將緩衝池中的數據異步刷新到磁盤,保證數據的一致性,包括髒頁的刷新、合併插入緩衝、UNDO 頁的回收等。前端

 

IO Thread

  在 InnoDB 存儲引擎中大量使用了 AIO(Async IO)來處理寫 IO 請求,這樣能夠極大提升數據庫的性能。而 IO Thread 的主要工做是負責這些 IO 請求的回調處理。算法

  

   innodb_read_io_threads 、 innodb_write_io_threads :分別控制 read thread 和 write thread 數量。數據庫

 

Purge Thread

  事務被提交後,其所使用的 undolog 可能再也不須要,所以須要 PurgeThread 來回收已經被使用並分配的 undo 頁。緩存

  用戶能夠在 MySQL 數據庫的配置文件中添加以下命令來啓用獨立的 Purge Thread(默認是 Master Thread 來完成回收工做):數據結構

       innodb_purge_threads=n //innodb 支持多個 Purge Thread架構

 

Page Cleaner Thread

  做用是將以前版本中髒頁的刷新操做都放入到單獨的線程中來完成。目的是爲了減輕原 Master Thread 的工做及對於用戶查詢線程的阻塞,進一步提升 InnoDB 存儲引擎的性能。併發

 

內存

 

緩衝池

  在數據庫中進行讀取頁的操做,首先將磁盤讀到的頁存放在緩衝池中,這個過程稱爲將頁 FIX 在緩衝池中。下一次再讀相同的頁時,首先判斷該頁是否在緩衝池中。若在緩衝池中,稱該頁在緩衝池中被命中,直接讀取該頁。不然,讀取磁盤上的頁。異步

  對於數據庫中頁的修改操做,則首先修改在緩衝池中命中的頁,而後再以必定的頻率刷新到磁盤上。頁從緩衝池刷新回磁盤的操做並非在每次頁發生更新時觸發,而是經過 Checkpoint 的機制刷新回磁盤。一樣,這也是爲了提升數據庫的總體性能。性能

   innodb_buffer_pool_size 設置緩衝池大小spa

  緩衝池中緩存的數據頁類型有:索引頁、數據頁、undo 頁、插入緩衝、自適應哈希索引、InnoDB 存儲的鎖信息、數據字典信息等。

  

  從 InnoDB 1.0.x 版本開始,容許有多個緩衝池實例。這樣作的好處是減小數據庫內部的資源競爭,增長數據庫的併發處理能力。可經過下面的參數進行配置:

       innodb_buffer_pool_instances=n //該值默認爲 1

  從 MySQL 5.6 版本開始,能夠經過 information_schema 架構下的表 INNODB_BUFFER_POOL_STATS 來觀察緩衝的狀態。

 

LRU List、Free List 和 Flush List

  數據庫的緩衝池是經過 LRU(Latest Recent Used,最近最少使用) 算法來進行管理的。即最頻繁使用的頁在 LRU 列表的前端,而最少使用的頁在 LRU 列表的尾端。當緩衝池不能存放新讀取到的頁時,將首先釋放 LRU 列表中尾端的頁。

  在 InnoDB 存儲引擎中,緩衝池中的頁默認爲 16KB。InnoDB 使用的並不是是樸素的 LRU 算法。

   innodb_old_blocks_pct //控制新讀取的頁插入到 LRU 列表尾端的位置

   innodb_old_blocks_time //控制頁讀取到 mid 位置後須要等待多久纔會被加入到 LRU 列表的熱端

  

    當頁從 LRU 列表的 old 部分加入到 new 部分時,稱此時發生的操做爲 page made young,而由於 innodb_old_blocks_time 的設置而致使頁沒有從 old 部分移動到 new 部分的操做稱爲 page not made young。

    Free buffers 表示當前 Free 列表中也的數量

    Database pages 表示 LRU 列表中頁的數量

    可能的狀況是 Free buffers 與 Database pages 的數量之和不等於 Buffer pool size。由於緩衝池中的頁還可能會被分配給自適應哈希索引、Lock 信息、Insert Buffer 等頁,而這部分頁不須要 LRU 算法進行維護,所以不存在於 LRU 列表中。

    youngs/s、non-youngs/s 表示每秒這兩類操做的次數。

    Buffer pool hit rate 表示緩衝池命中率,一般該值不該該小於 95%。若發生小於 95% 這種狀況,用戶須要觀察是不是因爲全表掃描引發的 LRU 列表被污染的問題。

    Modified db pages 顯示了髒頁的數量。

  能夠經過 INNODB_BUFFER_POOL_STATS 來觀察緩衝池的運行狀態。

  能夠經過表 INNODB_BUFFER_PAGE_LRU 來觀察每一個 LRU 列表中每一個頁的具體信息。

 

重作日誌緩衝

  InnoDB 存儲引擎首先將重作日誌信息先放入到這個緩衝區,而後按必定頻率將其刷新到重作日誌文件。

  重作日誌文件通常不須要設置的很大,由於通常狀況下每秒會將重作日誌緩衝刷新到日誌文件,所以用戶只須要保證每秒產生的事務量在這個緩衝大小以內便可。

       innodb_log_buffer_size //默認爲 8MB

 

額外的內存池

  在對一些數據結構自己的內存進行分配時,須要從額外的內存池中進行申請,當該區域的內存不夠時,會從緩衝池中進行申請。

相關文章
相關標籤/搜索