【MySQL架構圖】git
MySQL簡要架構圖以下圖所示,引擎層以插件方式集成了不一樣的存儲引擎,它們共用Server層對外提供服務。github
- 鏈接器:用於鏈接管理,進行身份認證及權限相關的管理。(登陸MySQL)
- 查詢緩存區:執行查詢語句時,先從緩存區查詢。(該功能V8.0以後移除)
- 分析器:未命中緩存時,對SQL進行詞法分析、語法分析。
- 優化器:按照MySQL認爲的最優方案,生成執行計劃。
- 執行器:執行SQL,並從存儲引擎返回數據。
- 存儲引擎:存儲數據,提供讀寫接口
【MySQL存儲引擎】sql
V5.5以前MySQL的默認存儲引擎爲MyISAM(ISAM:Indexed Sequential Access Method,即有索引的順序訪問方法。MyISAM是基於傳統的ISAM優化而來)數據庫
V5.5以後,MySQL的默認存儲引擎便更改成InnoDB,主要是爲支持數據庫事務安全而設計。緩存
# MyISAM vs InnoDB安全
- 鎖:MyISAM支持表級鎖;InnoDB支持行級鎖(默認)。所以併發操做時,InnoDB的效率要更高。
- 性能:MyISAM執行大量select和insert操做時,效率更高;InnoDB執行大量update和insert操做時,效率更高。
- 外鍵:MyISAM不支持;InnoDB支持外鍵。
- 事務:MyISAM不支持事務操做;InnoDB支持數據庫事務。
- 崩潰後安全恢復:MyISAM不支持;InnoDB支持。
- MVCC:MVCC:Multi-Version Concurrency Control,基於多版本的併發控制協議。做用於
READ COMMITTED
和REPEATABLE READ
兩個隔離級別下,是一種樂觀鎖,相對基於鎖的併發控制更加高效。最基本的原則是:讀不加鎖,讀寫不衝突。僅InnoDB支持。
【MySQL索引】數據結構
MySQL索引使用的數據結構主要有BTree索引 和 哈希索引 。查詢結果爲單條時,哈希索引性能更好;其他場景BTree索引更優。架構
InnoDB存儲引擎下,數據文件和索引文件是一體的。表數據文件自己就是按B+Tree組織的一個索引結構,樹的葉節點data域保存了完整的數據記錄。併發
【MySQL日誌模塊】ide
MySQL的Server層自帶有歸檔日誌模塊 binlog,每當MySQL執行更新操做時(insert、delete、update),SQL執行記錄會記錄到該日誌中。該日誌模塊爲全部存儲引擎所共享。
引擎層中的InnoDB存儲引擎還獨有一個重作日誌模塊 redo log,也會用來記錄SQL執行更新的操做。該模塊能夠保證MySQL崩潰後安全恢復,也是InnoDB能夠支持事務操做的重要模塊。
使用InnoDB執行更新操做的流程:
分析器 —— 權限驗證 —— 執行器 —— 存儲引擎 ——記錄redo log(prepare狀態) —— 記錄bin log —— 記錄redo log(commit狀態)
【MySQL部署模式】
- 單點模式。經常使用的部署模式,但沒法實現容災。
- 主從模式。一主多從,讀寫分離。解決單點負載瓶頸。主節點宕機,需將從節點切換爲主節點來保證服務可用。
- 主從模式下數據同步過程:
- 主節點負責寫,並將更改操做記錄到歸檔日誌bin log中;
- 從節點的IO線程將主的binlog事件(sql語句) 同步本機上並記錄在中繼日誌relay log裏;
- 從節點的SQL線程按照relay log中記錄順序執行SQL,使得主從數據同步。
- 主從模式下數據同步過程:
- 集羣模式。各節點都可對外提供讀寫服務,一個節點寫的操做會同步到其餘全部節點以知足數據一致性。但任意節點宕機不影響集羣服務。
參考文獻:(文章僅作交流學習,侵權即刪!!)