InnoDB深入理解

InnoDB體系架構 (存儲引擎內存池,後臺現成)

簡單的將就是兩個部分,一個是一個存儲引擎內存池,還有一個就是有很多個後臺線程,具體的講是7個,4個IO線程 1個主要線程,1個鎖監控線程,1個錯誤監控線程,四個IO分別是插入緩衝,日誌 讀 寫。

存儲引擎內存池具體的說是一個緩衝池,重做日誌緩衝池,以及額外的內存池三個部分。一般緩衝池的大小是最大的,重做日誌緩衝池和額外內存池比較小。

緩衝池主要是用來存放各種數據,這個地方牽扯到了InnoDB工作方式,就是將數據庫文件按頁讀取到緩衝池,如果數據庫文件需要修改,也是先修改緩衝池,然後刷新到文件的。

一般緩衝池中存放的是索引頁,數據頁,還有插入緩衝,自適應哈希索引,InnoDB的鎖信息,數據字典等。

重做日誌緩衝池,一般是將重做日誌信息放到這個緩衝區中,然後按照一定頻率將其刷新到文件。

額外內存緩衝池也很重要,對一些數據結構本身分配內存時,需要從額外緩衝池中分配。

綜上,我們可以歸納出InnoDB體系結構

1.存儲引擎池,

a) 緩衝池,用來緩存各種數據,索引,數據,鎖的信息,錯誤信息等

b) 重做日誌緩衝池,重做日誌信息會放到這個緩衝池中,然後刷新到日誌文件

c) 額外內存緩衝池,數據結構本身信息存放。

2. 7個線程

a) 4個IO線程 插入緩衝 讀 寫 日誌

b) 1個鎖監控線程

c) 1個錯誤監控線程

d) 1個主要線程

InnoDB的關鍵特性 (插入緩衝 兩次寫 自適應哈希)

1.插入緩衝,主要是針對非主鍵索引的插入和更新操作,如果是主鍵索引,順序的插入就可以了,數據頁的存放還是主鍵id的執行順序,但是非主鍵索引,葉子節點的插入不再是順序的,這個時候需要離散的訪問非聚集索引,插入性能會變得很低。

插入緩衝的作用就是,對於非聚集索引的插入和更新,不是每一次直接插入索引頁中,而是先判斷非聚集索引頁是否裏,如果存在,那麼直接插入,不存在就先插入到緩衝池中,然後以一定的頻率合併緩衝區和索引頁。

插入緩衝使用滿足兩個條件,1,非聚集索引, 2,索引不是唯一的

插入緩衝存在一個問題,在寫密集的時候,插入緩衝會佔用過多緩衝池內存,默認情況下最大可以佔用1/2緩衝池內存。

2.兩次寫

如果說插入緩衝給InnoDB帶來的是性能,那麼兩次寫給InnoDB帶來的就是數據的可靠性,如果在寫一個頁的時候,服務器宕機,那麼就會導致這個頁只寫了一部分的情況,我們稱這種情況叫做寫失效,兩次寫就是準備一個副本,當寫失效的時候,通過寫副本來恢復原來的數據,在進行重做,至於如果進行,InnoDB存儲引擎提供了一個兩次寫緩衝,大小爲2M,另一個就是物理磁盤上共享表空間中連續的128個頁。

當操作系統將頁寫入磁盤的時候宕掉了,那麼在恢復過程中,InnoDB存儲引擎可以從共享表空間中的doublewrite中找到該頁的副本,然後將副本拷貝到表空間,在做重用日誌。

3.自適應哈希索引

哈希是一種非常快的查找方法。官方的數據是,使用自適應哈希索引後,讀取和寫入數據可以提高2倍,對於輔助索引的的鏈接操作,性能可以提高至5倍


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章