(本片博文是《MySQL技術(shù)內(nèi)幕 InnoDB存儲引擎第二版》的讀書筆記)
這是《MySQL技術(shù)內(nèi)幕 InnoDB存儲引擎》一書中的InnoDB存儲引擎體系結(jié)構(gòu)圖。
1.PNG
多線程
InnoDB存儲引擎是多線程的模型,因此其后臺有多個不同的線程,負(fù)責(zé)處理不同的任務(wù):
- Master Thread
一個核心的后臺線程,主要負(fù)責(zé)將緩沖池中的數(shù)據(jù)異步刷新到磁盤,保證
數(shù)據(jù)的一致性,包括臟頁的刷新、合并插入緩沖、UNDO頁的回收等。 - IO Thread
InnoDB存儲引擎大量使用了AIO(Async IO)來處理寫IO請求,這樣極大地提高了數(shù)據(jù)庫的性能。IO Thread的工作主要是負(fù)責(zé)這些IO請求的回調(diào)處理。 - Purge Thread
事務(wù)被提交后,其所使用的undolog可能不再需要,因此需要Purge Thread來回收已經(jīng)使用并分配的undo頁。 - Page Cleaner Thread
Page Cleaner Thread是在InnoDB1.2.x版本中引入的。其作用是將之前版本中臟頁的刷新操作都放入到單獨的線程中來完成。目的是為了減輕原Master Thread的工作及對于用戶查詢線程的阻塞,進(jìn)一步提高InnoDB存儲引擎的性能。
內(nèi)存
- 緩沖池
InnoDB存儲引擎的基于磁盤存儲的,并將其中的記錄按照頁的方式進(jìn)行管理。因此可將其視為Disk-base Database,由于CPU速度與磁盤速度之間的鴻溝,基于磁盤的數(shù)據(jù)庫系統(tǒng)通常使用緩沖池技術(shù)來提高數(shù)據(jù)庫的整體性能。
緩沖池簡單來說就是一塊內(nèi)存區(qū)域,通過內(nèi)存的速度來彌補磁盤速度對數(shù)據(jù)庫性能的影響。在數(shù)據(jù)庫中進(jìn)行讀取頁的操作,首先將從磁盤讀到的頁存放在緩沖池中,這個過程稱為“FIX”在緩沖池中。下一次再讀相同的頁時,首先判斷該頁是否在緩沖池中。若在緩沖池中,稱該頁在緩沖池中被命中,直接讀取該頁。否則,讀取磁盤上的頁。(和OS中緩存有些類似?)
對于頁修改操作,首先修改在緩沖池中的頁,然后再以一定的頻率刷新到磁盤上。這里需要注意的是,頁從緩沖池刷新回磁盤并不是在每次頁發(fā)生更改時觸發(fā),而是通過一種叫Checkpoint的機制刷新回磁盤。這樣最也是為了提高數(shù)據(jù)庫的整體性能。
緩沖池的大小會直接影響到數(shù)據(jù)庫的性能,通過配置緩沖池參數(shù)innodb_buffer_pool_size可以來設(shè)置緩沖池大小。
不能簡單的認(rèn)為緩沖池只是緩沖索引頁和數(shù)據(jù)頁,它們只是占緩沖池很大一部分而已,其他比如undo頁、插入緩沖、自適應(yīng)哈希索引、InnoDB存儲的鎖信息、數(shù)據(jù)字典信息等都會在緩沖池中緩存,以下是InnoDB存儲引擎中內(nèi)存的結(jié)構(gòu)情況:
2.PNG
InnoDB1.0.x版本開始,就允許有多個緩沖池實例。每個頁根據(jù)哈希值平均到不同緩沖池實例中。這樣就減少了數(shù)據(jù)庫內(nèi)部的資源競爭,增加數(shù)據(jù)庫的并發(fā)處理能力。
LRU List
通常來說,數(shù)據(jù)庫中的緩沖池是通過LRU(Latest Recent Used,最近最少使用)算法來進(jìn)行管理。訪問最頻繁的頁在LRU列表的前端,而最少使用的頁在LRU列表的尾端。緩沖池滿時,首先釋放尾端頁。
InnoDB存儲引擎中,用優(yōu)化過的LRU算法對緩沖池進(jìn)行管理。LRU列表中加入了midpoint位置,新讀取到的頁,雖然是新頁,但并不直接放入到LRU列表的首部,而是放入到LRU列表的midpoint位置。(這個算法在InnoDB存儲引擎中稱為midpoint insertion strategy)。默認(rèn)配置下,該位置在LRU列表的5/8處,可由參數(shù)innodb_old_blocks_pct控制。midpoint之后的列表稱為old列表,之前的列表稱為new列表??梢院唵蔚乩斫鉃閚ew列表中的頁都是最為活躍的熱點數(shù)據(jù)。