內(nèi)存模型:
1.緩沖池
InnoDB存儲引擎是基于磁盤儲存的珊蟀,并將其中的記錄按照頁的方式進行管理。由于CPU速度與磁盤速度之間的鴻溝外驱,InnoDB采用了緩沖池技術(shù)來提高數(shù)據(jù)庫的整體性能育灸。
緩沖池簡單來鎖就是一塊內(nèi)存區(qū)域,通過內(nèi)存的速度來彌補磁盤速度較慢對數(shù)據(jù)庫性能的影響昵宇。在數(shù)據(jù)庫中進行讀取頁的操作磅崭,首先會從磁盤上讀取的頁存放在緩沖池中,如果下一次再讀取相同的頁時該頁仍在緩沖池中瓦哎,那么就會直接在內(nèi)存中讀取該頁砸喻。在數(shù)據(jù)庫中進行對頁的修改操作,則首先修改在緩沖池中的頁蒋譬,然后再以一定的頻率刷新到磁盤上割岛。這里需要注意的是,頁從緩沖池中刷新回磁盤的操作并不是發(fā)生在頁更新時犯助,而是通過一個CheckPoint的機制刷新回磁盤癣漆。
在緩沖池中緩存的數(shù)據(jù)頁類型有:索引頁、數(shù)據(jù)頁剂买、undo頁惠爽、插入緩沖、自適應(yīng)哈希索引瞬哼、InnoDB存儲的鎖信息等婚肆。緩沖池實例默認為1個,不過可以通過參數(shù) innodb_buffer_pool_instances 來進行配置坐慰,多個緩沖池對根據(jù)每個頁的哈希值來平均分配较性,減少了數(shù)據(jù)庫內(nèi)部的資源競爭,增加了并發(fā)處理能力。
2.LRU List
InnoDB采用了緩沖池來存放各種類型的頁來提升數(shù)據(jù)交互的性能赞咙,但是內(nèi)存資源畢竟是有限的永毅,所以InnoDB采用了LRU算法來進行緩沖池的內(nèi)存管理(插入緩沖、自適應(yīng)哈希索引人弓、InnoDB存儲的鎖信息等頁不受LRU管理)沼死。傳統(tǒng)的LRU算法原理為:最頻繁使用的頁會在LRU列表的前端,而最少使用的頁在LRU列表的尾端崔赌,當(dāng)緩沖池不能再存放新讀取的頁時意蛀,將會首先是否LRU列表尾端的頁。
在InnoDB的緩沖池中健芭,對傳統(tǒng)的LRU算法進行了一些優(yōu)化:在傳統(tǒng)的LRU算法的基礎(chǔ)上加入了midPoint的概念县钥,即新讀取到的頁,雖然是最新訪問的頁慈迈,但是并不直接放到LRU列表的首部若贮,而是放到LRU列表的midPoint的位置(默認為LRU列表長度的5/8)。這樣可以防止某一次全表掃描操作時痒留,將大量的頁讀入緩沖池(這些頁并不是活躍的數(shù)據(jù))谴麦,導(dǎo)致內(nèi)存不足,將大量甚至全部的熱點數(shù)據(jù)都給回收掉了伸头。在midPoint之后的數(shù)據(jù)會根據(jù)是否被再次讀取或者停留一段時間后匾效,被移至midPoint之前的列表,而midPoint之前的數(shù)據(jù)也會隨著長時間未被使用或者被新的數(shù)據(jù)擠壓而被移至midPoint之后的列表恤磷。
3.redoLog緩沖
InnoDB儲存引擎首先將重做日志信息先放入到redoLog緩沖區(qū)面哼,然后會以下三種方式刷新至redoLog文件中(磁盤順序?qū)懀?/p>
? ? Master Thread按一定頻率(默認一秒一次)將redoLog緩沖刷新到redoLog文件。
? ? 當(dāng)每個事務(wù)提交時扫步。
? ? 當(dāng)redoLog緩沖池剩余空間小于二分之一時魔策。
任務(wù)模型:
InnoDB是多線程的模型,其后臺有多個不同的后臺線程河胎,負責(zé)處理不同的任務(wù)闯袒。
1.Master Thread
核心線程主要負責(zé):將緩沖池等待數(shù)據(jù)異步刷新到磁盤,保證數(shù)據(jù)的一致性仿粹、臟頁的刷新搁吓、合并插入緩沖、undo頁的回收吭历、將redolog buffer 刷新至 redolog文件中。
2.IO Thread
InnoDB使用AIO來處理寫IO請求擂橘,這樣可以極大的提高數(shù)據(jù)庫的性能晌区,而IO Thread的工作主要是負責(zé)這些IO請求的回調(diào)處理。
3.Purge Thread
當(dāng)事務(wù)被提交后,其所使用的undolog可能不再需要朗若,因此使用PurgeThread來回收已經(jīng)使用并分配undo頁恼五,用于減少Master Thread線程的壓力。
4.Page Cleaner Thread
其作用是將臟頁的刷新操作都放入單獨的線程來完成哭懈,用于減少Master Thread線程的壓力灾馒,以及緩解對用戶查詢線程的阻塞。