關係型數據庫——MySQL

【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部署模式】

  • 單點模式。經常使用的部署模式,但沒法實現容災。
  • 主從模式。一主多從,讀寫分離。解決單點負載瓶頸。主節點宕機,需將從節點切換爲主節點來保證服務可用。
    • 主從模式下數據同步過程:
      1. 主節點負責寫,並將更改操做記錄到歸檔日誌bin log中;
      2. 從節點的IO線程將主的binlog事件(sql語句) 同步本機上並記錄在中繼日誌relay log裏;
      3. 從節點的SQL線程按照relay log中記錄順序執行SQL,使得主從數據同步。
  • 集羣模式。各節點都可對外提供讀寫服務,一個節點寫的操做會同步到其餘全部節點以知足數據一致性。但任意節點宕機不影響集羣服務。

 

參考文獻:(文章僅作交流學習,侵權即刪!!)

一、https://github.com/Snailclimb/JavaGuide

二、https://blog.csdn.net/AGambler/article/details/84672849

相關文章
相關標籤/搜索