1、InnoDB存儲引擎概述
InnoDB存儲引擎是第一個完整支持ACID事務的MySql存儲引擎,其特點是行鎖設計、支持MVCC、支持外鍵、提供一致性非鎖定讀,同時被設計用來最有效地利用以及使用CPU和內存。
2、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存儲引擎的性能。