MySQL架構與存儲引擎
一、MySQL架構
鏈接層:完成客戶端和鏈接服務,主要功能爲鏈接處理、受權認證、安全方案認證sql
服務層:權限判斷, sql解析,執行計劃優化;存儲過程,觸發器,視圖數據庫
引擎層:底層數據存取操做實現部分緩存
存儲層:設備的文件系統
安全
二、一條SQL執行流程
客戶端請求 ---> 鏈接器(驗證用戶身份,給予權限) ---> 查詢緩存(存在緩存則直接返回,不存在則執行後續操做) ---> 分析器(對SQL進行詞法分析和語法分析操做) ---> 優化器(主要對執行的sql優化選擇最優的執行方案方法) ---> 執行器(執行時會先看用戶是否有執行權限,有才去使用這個引擎提供的接口) ---> 去引擎層獲取數據返回微信
三、更新數據執行流程
取數據行
: 執行器先找引擎取 ID=2 這一行:ID 是主鍵,引擎直接用樹搜索找到這一行。若是 ID=2 這一行所在的數據頁原本就在內存中,就直接返回給執行器;不然,須要先從磁盤讀入內存,而後再返回。)架構更新數據
: 執行器拿到引擎給的行數據,把這個值加上 1,好比原來是 N,如今就是 N+1,獲得新的一行數據,再調用引擎接口寫入這行新數據。併發更新內存
: 引擎將這行新數據更新到內存中,app更新 redo log
:同時將這個更新操做記錄到 redo log 裏面,此時 redo log 處於 prepare 狀態。而後告知執行器執行完成了,隨時能夠提交事務。測試寫入binlog
:執行器生成這個操做的 binlog,並把 binlog 寫入磁盤。優化提交事務
: 執行器調用引擎的提交事務接口,引擎把剛剛寫入的 redo log 改爲提交(commit)狀態,更新完成
四、redo log簡介:
redo log 是InnoDB引擎特有的物理日誌,記錄的是數據頁的物理修改,即用於記錄事務操做的變化,無論事務是否提交都會記錄下來。有了 redo log,InnoDB 就能夠保證即便數據庫發生異常重啓,以前提交的記錄都不會丟失,InnoDB存儲引擎會使用redo log恢復到掉宕機前的時刻,以此來保證數據的完整性。這個能力稱爲crash-safe。
InnoDB的redo log 是固定大小,即記錄滿了之後就從頭循環寫。
流程
提交事務 -> 日誌寫入relog log buffer -> os buffer -> 寫入磁盤的log file -> 根據checkpoint更新磁盤中的數據
五、bin log簡介:
binlog是屬於MySQL Server層面的,又稱爲歸檔日誌,屬於邏輯日誌,
binlog主要做用:複製(Master-Slave 主從同步)、恢復和審計。
六、存儲引擎有哪些?
常見的存儲引擎就 InnoDB、MyISAM、Memory、NDB。
InnoDB 支持事務,MyISAM 不支持事務。這是 MySQL 將默認存儲引擎從 MyISAM 變成 InnoDB 的重要緣由之一;
InnoDB 支持外鍵,而 MyISAM 不支持。對一個包含外鍵的 InnoDB 錶轉爲 MYISAM 會失敗;
InnoDB 是聚簇索引,MyISAM 是非聚簇索引。聚簇索引的文件存放在主鍵索引的葉子節點上,所以 InnoDB 必需要有主鍵,經過主鍵索引效率很高。可是輔助索引須要兩次查詢,先查詢到主鍵,而後再經過主鍵查詢到數據。所以,主鍵不該該過大,由於主鍵太大,其餘索引也都會很大。而 MyISAM 是非彙集索引,數據文件是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。
InnoDB 不保存表的具體行數,執行select count(*) from table 時須要全表掃描。而 MyISAM 用一個變量保存了整個表的行數,執行上述語句時只須要讀出該變量便可,速度很快;
InnoDB 最小的鎖粒度是行鎖,MyISAM 最小的鎖粒度是表鎖。一個更新語句會鎖住整張表,致使其餘查詢和更新都會被阻塞,所以併發訪問受限。這也是 MySQL 將默認存儲引擎從 MyISAM 變成 InnoDB 的重要緣由之一;
本文分享自微信公衆號 - 測試開發進階圈(testAdvance)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。