(本片博文是《MySQL技術(shù)內(nèi)幕 InnoDB存儲(chǔ)引擎第二版》的讀書筆記)
這是《MySQL技術(shù)內(nèi)幕 InnoDB存儲(chǔ)引擎》一書中的InnoDB存儲(chǔ)引擎體系結(jié)構(gòu)圖。
多線程
InnoDB存儲(chǔ)引擎是多線程的模型,因此其后臺(tái)有多個(gè)不同的線程孙咪,負(fù)責(zé)處理不同的任務(wù):
- Master Thread
一個(gè)核心的后臺(tái)線程备绽,主要負(fù)責(zé)將緩沖池中的數(shù)據(jù)異步刷新到磁盤贡这,保證
數(shù)據(jù)的一致性戈泼,包括臟頁的刷新南片、合并插入緩沖睡陪、UNDO頁的回收等寺渗。 - IO Thread
InnoDB存儲(chǔ)引擎大量使用了AIO(Async IO)來處理寫IO請(qǐng)求匿情,這樣極大地提高了數(shù)據(jù)庫的性能。IO Thread的工作主要是負(fù)責(zé)這些IO請(qǐng)求的回調(diào)處理信殊。 - Purge Thread
事務(wù)被提交后炬称,其所使用的undolog可能不再需要,因此需要Purge Thread來回收已經(jīng)使用并分配的undo頁鸡号。 - Page Cleaner Thread
Page Cleaner Thread是在InnoDB1.2.x版本中引入的转砖。其作用是將之前版本中臟頁的刷新操作都放入到單獨(dú)的線程中來完成。目的是為了減輕原Master Thread的工作及對(duì)于用戶查詢線程的阻塞鲸伴,進(jìn)一步提高InnoDB存儲(chǔ)引擎的性能府蔗。
內(nèi)存
- 緩沖池
InnoDB存儲(chǔ)引擎的基于磁盤存儲(chǔ)的,并將其中的記錄按照頁的方式進(jìn)行管理汞窗。因此可將其視為Disk-base Database姓赤,由于CPU速度與磁盤速度之間的鴻溝,基于磁盤的數(shù)據(jù)庫系統(tǒng)通常使用緩沖池技術(shù)來提高數(shù)據(jù)庫的整體性能仲吏。
緩沖池簡(jiǎn)單來說就是一塊內(nèi)存區(qū)域不铆,通過內(nèi)存的速度來彌補(bǔ)磁盤速度對(duì)數(shù)據(jù)庫性能的影響。在數(shù)據(jù)庫中進(jìn)行讀取頁的操作裹唆,首先將從磁盤讀到的頁存放在緩沖池中誓斥,這個(gè)過程稱為“FIX”在緩沖池中。下一次再讀相同的頁時(shí)许帐,首先判斷該頁是否在緩沖池中劳坑。若在緩沖池中,稱該頁在緩沖池中被命中成畦,直接讀取該頁距芬。否則,讀取磁盤上的頁循帐。(和OS中緩存有些類似框仔?)
對(duì)于頁修改操作,首先修改在緩沖池中的頁拄养,然后再以一定的頻率刷新到磁盤上离斩。這里需要注意的是,頁從緩沖池刷新回磁盤并不是在每次頁發(fā)生更改時(shí)觸發(fā)瘪匿,而是通過一種叫Checkpoint的機(jī)制刷新回磁盤跛梗。這樣最也是為了提高數(shù)據(jù)庫的整體性能。
緩沖池的大小會(huì)直接影響到數(shù)據(jù)庫的性能柿顶,通過配置緩沖池參數(shù)innodb_buffer_pool_size可以來設(shè)置緩沖池大小茄袖。
不能簡(jiǎn)單的認(rèn)為緩沖池只是緩沖索引頁和數(shù)據(jù)頁操软,它們只是占緩沖池很大一部分而已嘁锯,其他比如undo頁、插入緩沖、自適應(yīng)哈希索引家乘、InnoDB存儲(chǔ)的鎖信息蝗羊、數(shù)據(jù)字典信息等都會(huì)在緩沖池中緩存,以下是InnoDB存儲(chǔ)引擎中內(nèi)存的結(jié)構(gòu)情況:
InnoDB1.0.x版本開始仁锯,就允許有多個(gè)緩沖池實(shí)例耀找。每個(gè)頁根據(jù)哈希值平均到不同緩沖池實(shí)例中。這樣就減少了數(shù)據(jù)庫內(nèi)部的資源競(jìng)爭(zhēng)业崖,增加數(shù)據(jù)庫的并發(fā)處理能力野芒。
LRU List
通常來說,數(shù)據(jù)庫中的緩沖池是通過LRU(Latest Recent Used双炕,最近最少使用)算法來進(jìn)行管理狞悲。訪問最頻繁的頁在LRU列表的前端,而最少使用的頁在LRU列表的尾端妇斤。緩沖池滿時(shí)摇锋,首先釋放尾端頁。
InnoDB存儲(chǔ)引擎中站超,用優(yōu)化過的LRU算法對(duì)緩沖池進(jìn)行管理荸恕。LRU列表中加入了midpoint位置,新讀取到的頁死相,雖然是新頁融求,但并不直接放入到LRU列表的首部,而是放入到LRU列表的midpoint位置媳纬。(這個(gè)算法在InnoDB存儲(chǔ)引擎中稱為midpoint insertion strategy)双肤。默認(rèn)配置下,該位置在LRU列表的5/8處钮惠,可由參數(shù)innodb_old_blocks_pct控制茅糜。midpoint之后的列表稱為old列表,之前的列表稱為new列表素挽∶镒福可以簡(jiǎn)單地理解為new列表中的頁都是最為活躍的熱點(diǎn)數(shù)據(jù)。