InnoDB 存储引擎体系架构
首先以一張圖簡單展示 InnoDB 的存儲引擎的體系架構(gòu).從圖中可見, InnoDB 存儲引擎有多個內(nèi)存塊,這些內(nèi)存塊組成了一個大的內(nèi)存池,主要負責(zé)如下工作:
-
維護所有進程/線程需要訪問的多個內(nèi)部數(shù)據(jù)結(jié)構(gòu)
-
緩存磁盤上的數(shù)據(jù), 方便快速讀取, 同時在對磁盤文件修改之前進行緩存
-
重做日志(redo log)緩沖
后臺線程的主要作用是負責(zé)刷新內(nèi)存池中的數(shù)據(jù),保證緩沖池中的內(nèi)存緩存的是最新數(shù)據(jù);將已修改數(shù)據(jù)文件刷新到磁盤文件;保證數(shù)據(jù)庫發(fā)生異常時 InnoDB 能恢復(fù)到正常運行 的狀態(tài)
后臺線程
InnoDB 使用的是多線程模型, 其后臺有多個不同的線程負責(zé)處理不同的任務(wù)
1. Master Thread
這是最核心的一個線程,主要負責(zé)將緩沖池中的數(shù)據(jù)異步刷新到磁盤,保證數(shù)據(jù)的一致性,包括贓頁的刷新、合并插入緩沖、UNDO 頁的回收等.
2. IO Thread
在 InnoDB 存儲引擎中大量使用了異步 IO 來處理寫 IO 請求, IO Thread 的工作主要是負責(zé)這些 IO 請求的回調(diào).
可以通過命令來觀察 InnoDB 中的 IO Thread:
mysql> SHOW ENGINE INNODB STATUS\G *************************** 1. row ***************************Type: InnoDBName: Status: ===================================== 2016-03-23 20:19:53 0x700000d51000 INNODB MONITOR OUTPUT .... ... -------- FILE I/O -------- I/O thread 0 state: waiting for i/o request (insert buffer thread) I/O thread 1 state: waiting for i/o request (log thread) I/O thread 2 state: waiting for i/o request (read thread) I/O thread 3 state: waiting for i/o request (read thread) I/O thread 4 state: waiting for i/o request (read thread) I/O thread 5 state: waiting for i/o request (read thread) I/O thread 6 state: waiting for i/o request (write thread) I/O thread 7 state: waiting for i/o request (write thread) I/O thread 8 state: waiting for i/o request (write thread) I/O thread 9 state: waiting for i/o request (write thread) ...... ---------------------------- END OF INNODB MONITOR OUTPUT可以看到, InnoDB 共有10個 IO Thread, 分別是 4個 write、4個 read、1個 insert buffer和1個 log thread.
3. Perge Thread
事物被提交之后, undo log 可能不再需要,因此需要 Purge Thread 來回收已經(jīng)使用比分配的 undo頁. InnoDB 支持多個 Purge Thread, 這樣做可以加快 undo 頁的回收
InnoDB 引擎默認設(shè)置為4個 Purge Thread:
4. Page Cleaner Thread
Page Cleaner Thread 是新引入的,其作用是將之前版本中臟頁的刷新操作都放入單獨的線程中來完成,這樣減輕了 Master Thread 的工作及對于用戶查詢線程的阻塞
內(nèi)存
1. 緩沖池
InnoDB 存儲引擎是基于磁盤存儲的,其中的記錄按照頁的方式進行管理,由于 CPU 速度和磁盤速度之間的鴻溝, InnoDB 引擎使用緩沖池技術(shù)來提高數(shù)據(jù)庫的整體性能.
緩沖池簡單來說就是一塊內(nèi)存區(qū)域.在數(shù)據(jù)庫中進行讀取頁的操作,首先將從磁盤讀到的頁存放在緩沖池中,下一次讀取相同的頁時,首先判斷該頁是不是在緩沖池中,若在,稱該頁在緩沖池中被命中,直接讀取該頁.否則,讀取磁盤上的頁.
對于數(shù)據(jù)庫中頁的修改操作,首先修改在緩沖池中頁,然后再以一定的頻率刷新到磁盤,并不是每次頁發(fā)生改變就刷新回磁盤.
緩沖池的大小直接影響數(shù)據(jù)庫的整體性能,對于 InnoDB 存儲引擎而言,緩沖池配置通過參數(shù)?innodb_buffer_pool_size?來設(shè)置. 下面顯示本機虛擬機上一臺 MySQL 數(shù)據(jù)庫配置:
mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool_size'\G *************************** 1. row *************************** Variable_name: innodb_buffer_pool_size Value: 134217728 1 row in set (0.00 sec) 緩沖池中緩存的數(shù)據(jù)頁類型有:索引頁、數(shù)據(jù)頁、 undo 頁、插入緩沖、自適應(yīng)哈希索引、 InnoDB 的鎖信息、數(shù)據(jù)字典信息等.索引頁和數(shù)據(jù)頁占緩沖池的很大一部分.
下圖顯示 InnoDB 存儲引擎總內(nèi)存的結(jié)構(gòu)情況.
2. 重做日志緩沖
InnoDB 存儲引擎先將重做日志信息放入這個緩沖區(qū),然后以一定頻率將其刷新到重做日志文件.重做日志文件一般不需要設(shè)置得很大,因為在下列三種情況下重做日志緩沖中的內(nèi)容會刷新到磁盤的重做日志文件中.
Master Thread 每一秒將重做日志緩沖刷新到重做日志文件
每個事物提交時會將重做日志緩沖刷新到重做日志文件
當(dāng)重做日志緩沖剩余空間小于1/2時,重做日志緩沖刷新到重做日志文件
3. 額外的內(nèi)存池
在 InnoDB 存儲引擎中, 對一些數(shù)據(jù)結(jié)構(gòu)本身的內(nèi)存進行分配時,需要從額外的內(nèi)存池中進行申請.例如,分配了緩沖池,但是每個緩沖池中的幀緩沖還有對應(yīng)的緩沖控制對象,這些對象記錄以一些諸如 LRU, 鎖,等待等信息,而這個對象的內(nèi)存需要從額外的內(nèi)存池中申請.
from:?https://segmentfault.com/a/1190000004673132
總結(jié)
以上是生活随笔為你收集整理的InnoDB 存储引擎体系架构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式消息系统:Kafka
- 下一篇: JVM内幕:Java虚拟机详解