InnoDB儲存引擎——後臺執行緒

readyao發表於2017-03-10

1、InnoDB儲存引擎概述

InnoDB儲存引擎是第一個完整支援ACID事務的MySql儲存引擎,其特點是行鎖設計、支援MVCC、支援外來鍵、提供一致性非鎖定讀,同時被設計用來最有效地利用以及使用CPU和記憶體。

2、InnoDB體系結構

InnoDB體系架構

上圖是InnoDB儲存引擎的體系結構,可以看到InnoDB儲存引擎有很多記憶體塊,這些記憶體塊組成了一個大的記憶體池,負責如下工作:

  • 維護所有程式/執行緒需要訪問的多個內部資料結構;
  • 快取磁碟上的資料,方便快速地讀取,同時在對磁碟檔案的資料修改之前在這裡快取。
  • 重做日誌(redo log)緩衝。

後臺執行緒的主要作用是負責重新整理記憶體池中的資料,保證緩衝池中的記憶體快取是最近的資料 。此外,還將已經修改的資料檔案重新整理到磁碟檔案,同時保證在資料庫發生異常的情況下InnoDB能恢復到正常執行狀態。

InnoDB儲存引擎是多執行緒的模型,後臺有多個不同的後臺執行緒,負責處理不同的任務。

  • Master Thread
    Master Thread是一個非常核心的後臺執行緒,主要負責將緩衝池中的資料非同步重新整理到磁碟,保證資料的一致性,包括髒頁的重新整理、合併插入緩衝、UNDO頁的回收等。
  • IO Thread
    在 InnoDB儲存引擎中大量使用非同步IO來處理寫IO請求,這樣可以極大地提高資料庫的效能。
    而IO Thread的工作主要是負責這些IO請求的回撥處理。目前有4個read thread和4個write thread和1個insert thread和1個log IO thread。
    通過下面的命令觀察IO thread:
mysql> show engine innodb status\G

下面是部分輸出:

show engine innodb status
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
  • purge thread
    事務被提交之後,其所使用的undolog可能不在需要了,因此需要Purge Thread來回收已經使用並分配的undo頁。
    在InnoDB1.1版本之前,purge操作是在Master thread中完成的。從1.1版本開始,purge操作可以獨立到單獨的執行緒中,以此來減輕master thread的工作。不過,需要在配置檔案中新增如下命令才可以啟用獨立的Purge Thread:
[mysqld]
innodb_purge_threads=1

從版本1.2開始,InnoDB支援多個Purge Thread,這樣的目的是為了進一步加快undo頁的回收。
通過下面命令可以檢視InnoDB開啟了多少個purge thread:

mysql> show variables like 'innodb_purge_threads';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_purge_threads | 0     |
+----------------------+-------+
1 row in set (0.00 sec)

可以看到我的沒有配置purge thread為獨立的執行緒。

  • Page Cleaner Thread
    Page Cleaner Thread是在InnoDB1.2.X版本中引入的。其作用是將之前版本中髒頁的重新整理操作都放入到單獨的執行緒中來完成。
    其目的是減輕master thread的工作以及對於使用者查詢執行緒的阻塞,進一步提高InnoDB儲存引擎的效能。

相關文章