1.MYSQL & InnoDB體系結構
mysql介紹
MySQL是一個關係型資料庫管理系統,由瑞典MySQL AB 公司開發,目前屬於 Oracle 旗下產品。MySQL 是最流行的關係型資料庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS (Relational Database Management System,關係資料庫管理系統) 應用軟體。
mysql結構圖
可以看到mysql server主要由以下部分組成
- 連線池
- 管理服務和工具元件
- sql介面元件
- 查詢分析器
- 優化器元件
- 緩衝元件
- 可插拔的各種儲存引擎
物理檔案
MYSQL與其他資料庫最大的差別就是外掛式的各種儲存引擎,其他元件其他資料庫基本都有,不是本文重點。
MYSQL外掛式的儲存引擎架構提供了一系列標準的管理和服務支援,每個儲存引擎開發者都可以按照自己的意願開發。通過mysql建表語句可以發現儲存引擎是基於表的,而不是資料庫。如:
CREATE TABLE `NewTable` (
`a` int NULL
)ENGINE=InnoDB;
mysql豐富的儲存引擎
mysql各種不同的儲存引擎都有各自的特點,可以根據具體需求進行選擇,由於mysql的開源特性,市面上也有很多的非官方開源儲存引擎。
部分儲存引擎列表:
- InnoDB 支援事務,其設計的主要目的是面向線上事務處理應用
- MyISAM 不支援事務,根據表鎖設計,支援全文索引。
- NDB 叢集儲存引擎
- Memory 記憶體儲存引擎,速度非常快,只支援表鎖
- Archive 只支援insert 和select,使用zlib壓縮資料,非常適合記錄日誌
還有其他各種各樣的儲存引擎。。。。
其中支援事務的InnoDB儲存引擎為使用最多的儲存引擎。
InnoDB儲存引擎結構
InnoDB主要由三大塊組成:後臺執行緒、記憶體池、檔案。
- 後臺執行緒 負責重新整理緩衝資料到磁碟,回收資源等各種資料庫背後的工作。
- 記憶體池 緩衝資料,用以提升資料庫效能。
- 檔案 持久化資料庫資料,保證資料不會丟失
InnoDB記憶體池結構
InnoDB是基於磁碟的儲存引擎,並將其中記錄按頁的方式進行管理,可以視作是一個基於磁碟的資料庫系統。但是由於磁碟的讀寫速度,尤其是機械硬碟的隨機讀寫速度達不到使用者需求,因此使用緩衝池技術來提高資料庫整體效能。 當從資料庫中讀取頁的時候,首先從磁碟讀取頁放入緩衝池,當下次讀取相同頁時,判斷是否還在緩衝池中,命中該頁則不讀取磁碟 寫入資料庫頁時,先修改在緩衝池中的頁,然後以一定的規則和頻率重新整理到磁碟上。
其中:
- 資料頁 InnoDB是使用聚集索引存放記錄的,所以資料頁中包含主鍵索引和資料記錄。
- 索引頁 存放輔助索引資料
- 插入緩衝 對於非唯一輔助索引的插入和更新,不是每一次都插入到索引頁中,而是先插入緩衝池,然後再以一定頻率重新整理到非聚集索引上。減少資料庫隨機io寫入
- 自適應雜湊索引 InnoDB會監控表上索引頁的查詢,如果觀測到建立hash索引可以帶來速度提升就會建立hash索引,所以稱為自適應hash索引。不能人為建立
- 鎖資訊 innodb引擎鎖資源資訊存放
- 重做日誌緩衝 緩衝InnoDB事務產生的日誌,以一定頻率將其重新整理到重做日誌檔案中。在提交事務時也會重新整理到磁碟。
從這裡已經看到了InnoDB記憶體池的結構,以及各部分的作用,但是對於InnoDB怎麼使用記憶體池的呢?
InnoDB記憶體管理 LRUList FreeList
InnoDB緩衝池是一個很大的記憶體區域,其中存放了各種型別的資料。預設的緩衝池頁大小為16k,InnoDB使用LRU(Latest Recent Used 最近最少使用)演算法來管理記憶體池,最頻繁使用的頁在LRU列表的前端,最少使用的頁在LRU列表的尾端,當緩衝池不能存放新讀取到的頁時,首先釋放LRU尾端的頁。
InnoDB LRU演算法有一些優化,在列表中加入了midpoint,最新衝磁碟讀取到的頁並不是放入首部,而是放入midpoint位置。可用過innodb_old_blocks_pct控制,防止某些操作會將緩衝池中所有的頁刷出,可以根據應用的熱資料量來確定midpoint的位置。
當資料剛啟動時,LRUList為空,此時頁都存放在FreeList中,當需要從緩衝池中分配頁時,先在FreeList中檢視是否有空閒頁。否則根據LRU演算法淘汰LRU列表尾部的頁,將該頁分配給新的頁
後臺執行緒
InnoDB後臺執行緒主要由master 執行緒 、io執行緒、purge執行緒組成。其中master執行緒工作最多。
+ MasterThread InnoDB核心後臺執行緒,負責緩衝池資料非同步重新整理到磁碟、保證資料一致性、髒頁重新整理、合併插入緩衝、undo頁回收等。
+ IOThread InnoDB大量使用AIO來處理IO請求,IOThread主要負責這些IO請求的回撥處理
+ PurgeThread 回收undo頁
InnoDB檔案
表空間檔案
InnoDB將儲存的資料按表空間進行存放,預設配置會有一個初始大小10MB,名為ibdata1的檔案,可設定多個檔案組成一個表空間
若設定了innodb_file_per_table則每個基於InnoDB的表產生一個獨立的表空間,命名為:表名.idb,而不用將所有資料都存放在預設的表空間中。idb檔案中存放該表的資料、索引、插入緩衝BITMAP等。其餘資訊還是存放在共享表空間中。
重做日誌
redo log file是InnoDB儲存引擎的事務日誌。當資料庫掛掉的時候,InnoDB會根據重做日誌恢復到掛到之前的時刻,來保證資料的完整性。