史上最全MySQL架構,助你深度掌握MySQL開發管理,贏在大數據時代

前言

MySQL服務器由SQL層和存儲引擎層構成。SQL層主要功能包括權限判斷、SQL解析功能和查詢緩存處理等,存儲引擎層(Storage Engine Layer)完成底層數據庫數據存儲操作。

 

MySQL整體架構的SQL層和存儲引擎層實際上各自都包含了很多的小模塊,各個模塊的工作方式如下:

從上圖可以看出MySQL各個模塊的特點如下:

(1)客戶端通過連接/線程處理層來連接MySQL數據庫,連接/線程處理層主要用來處理客戶端的請求、身份驗證和數據庫安全性驗證等。

(2)查詢緩存和查詢分析器是SQL層的核心部分,其中主要涉及查詢的解析、優化、緩存,以及所有內置的函數,存儲過程,觸發器,視圖等功能。

(3)優化器主要負責存儲和獲取所有存儲在MySQL中的數據。

可以把這三層統稱爲MySQL數據庫的SQL層。

MySQL 各邏輯塊簡介

MySQL邏輯架構採用SQL層和存儲引擎分離的方式,真正實現了數據存儲和邏輯業務的分離,MySQL的SQL層從宏觀上可以分爲三層,事實上SQL層包含了很多的子模塊。下面就詳細介紹SQL層各個子模塊的功能。

1.初始化模塊

初始化模塊就是在數據庫啓動的時候,對整個數據庫做的一些初始化操作,例如,各種系統環境變量的初始化,各種緩存、存儲引擎初始化設置等。

在MySQL初始化過程中,部分系統參數是通過MySQL數據庫系統文件設置的。MySQL系統參數可以通過“mysqld -verbose -help” 命令來查看當前系統所有參數的設置。Linux 平臺上MySQL數據庫讀取文件首先會讀取/etcmy.cnf文件,該選項主要是用來設置MySQL全局選項,許多初學者在Linux平臺上安裝MySQL失敗就是因爲/et/my.cnf的設置是系統默認的錯誤路徑,對於初學者,可以將$MySQL. HOME/support. fles/目錄 下面的配置文件複製到/etc/my.cnf中,命令如下:

cp ./support_ files/my_ medium.cnf /etc/my. cnf

MySQL數據庫讀取完/et/my.cnf之後,接下來會解析SMySQL HOME/my.cnf.在這個過程中,服務器會到MySQL安裝目錄下面解析數據庫的相關配置。MySQL啓動初始化接着會解析dealuls-extra-file附帶選項,修改該參數可以指定系統配置文件,接下來數據庫會解析有關用戶的選項。

2.核心API

MySQL數據庫核心API主要實現了數據庫底層操作的優化功能,其中主要包括IO操作、格式化輸出、高性能存儲數據結果算法的優化,字符串的處理,其中最重要的是內存管理。

3.網絡交互模塊

MySQL底層相互交互的模塊抽象出接口,對外提供可以接收和發送數據的API接口,其他模塊需要交互的時候,可以通過API接口調用。

4.服務器客戶端交互協議模塊

MySQL服務器採用C/S的形式訪問數據庫,數據連接使用MySQL CIS交互協議模塊,實現了客戶端與服務器端交互過程中所需要的一些獨特的協議,這些協議都是建立在現有的網絡協議之上。

5.用戶模塊

用戶模塊主要功能是用於控制用戶登錄連接的權限和用戶的授權管理。

6.訪問控制模塊

訪問控制模塊主要用於監控用戶的每一-個操作。 訪問控制模塊實現的功能就是根據用戶模塊中不同的用戶授權,以及根據其數據庫的各種約束來控制用戶對數據的訪問。用戶模塊和訪問控制模塊結合起來,就組成了MySQL數據庫的權限管理功能。

7.連接管理、連接線程和線程管理

連接管理模塊負責監聽MySQL Server的各種請求,根據不同的請求,然後轉發到線程管理模塊,每個客戶請求都會被數據庫自動分配-一個 獨立的線程爲其單獨服務,而連接線程的主要工作就是負責MySQLServer與客戶端通信,線程管理模塊負責管理這些生成的線程。

8.轉發模塊

客戶端連接MySQL之後會發送一些查詢語句, 在MySQL Server裏面,連接線程接收到客戶端的一 個請求後,會直接將查詢轉發到各個對應的處理模塊。轉發模塊主要就是根據查詢語句語法分析,然後轉發給不同的模塊處理。

9.緩存模塊

查詢緩存模塊主要功能是將客戶端查詢的請求返回的結果集到緩存中,與查詢的一一個HASH值對應。在查詢的基表發生任何數據變化後,MySQL 會自動將其查詢的緩存失效。在讀寫比例非常高的應用系統中,查詢緩存對性能的提高是非常顯著的。

10.優化器模塊

這個模塊主要是將客戶端發送的查詢請求,在之前算法的基礎上分析,計算出一個最優的查詢策略,優化之後會提高查詢訪問的速度,最後根據其最優策略返回查詢語句。

11.表變更管理模塊

表變更管理模塊主要負責完成DML和DDL的查詢,例如,insert, update, delete, create,table, alter table等語句的處理。

12.表維護模塊

表維護模塊主要用於檢測表的狀態,分析、優化表結構,以及修復表。

13.系統狀態管理模塊

在客戶端請求系統狀態的時候,系統狀態模塊主要負責將各種狀態的數據返回給用戶。最常用的一-些查詢狀態的命令包括show satus, show variables等,都是通過這個模塊負責返回的。

14.表管理器

表管理器主要就是維護系統生成的表文件。例如,MyISAM存儲引擎類型表生成的是fm文件、MYD文件以及MYI文件,表管理器的工作就是維護這些文件,將各個表結構的信息緩存起來,另外該模塊還管理表級別的鎖。

15.日誌記錄模塊

日誌記錄模塊主要負責整個數據庫邏輯層的日誌文件,其中包含錯誤日誌,二進制日誌,以及慢查詢日誌等。

16.複製模塊

複製模塊分爲Master 模塊和Slave 模塊兩部分。Master 模塊主要負責複製環境中讀取Master端的binary日誌,以及Slave端的I/0 線程交互等工作。Slave 模塊主要有兩個線程,一個負責從Master請求和接收binary日誌,並寫入本地I/0線程:另一個從relay log讀取日誌事件,然後解析成可以在Slave端執行的命令,然後交給Slave端的SQL線程。

17.存儲引擎接口模塊

MySQL實現了其數據庫底層存儲引擎的插件式管理,將各種數據處理高度抽象化。

MySQL 物理文件的組成

 

MySQL的物理文件包括日誌文件、數據文件和其他文件,下 面將詳細介紹這些文件的義和作用。

1、日誌文件

在MySQL數據庫中,日誌文件主要記錄了數據庫操作信息和錯誤信息。常用的日誌文件包括錯誤日誌、二進制日誌、查詢日誌、慢查詢日誌和InnoDB引擎在線Redo日誌等。

(1)錯誤日誌: Error Log

錯誤日誌文件記錄了MySQL Server運行過程中遇到的所有嚴重的錯誤信息,以及MySQL每次啓動和關閉的詳細信息。默認情況下錯誤日誌功能是關閉的,啓動時要重新配置——og- er(-file_ name]選項,修改錯誤日誌存放的目錄和文件名稱。

(2)二進制日誌: Binary Log

二進制日誌文件就是常說的binlog。二進制日誌記錄了MySQL所有修改數據庫的操作,然後以二進制的形式記錄在日誌文件中,其中還包括每條語句所執行的時間和所消耗的資源,以及相關的事務信息。

默認情況下二進制日誌功能是開啓的,啓動時可以重新配置-log_bin[-file. _name]選項,修改二進制日誌存放的目錄和文件名稱。

(3)查詢日誌: Query Log

默認的查詢日誌文件是hostname.log.查詢日誌記錄所有的查詢操作,包括所有的select操作信息,體積比較大,開啓後對性能有較大的影響,可以通過“--log[-file_ name]" 選項開啓。如果需要跟蹤某些特殊的SQL性能問題,可以短暫地打開該功能。

(4)慢查詢日誌: Slow Query Log

慢查詢日誌是指所有SQL 執行的時間超過long_ query, fime變量的語句和達到min_ _examined_ row_ limit 條距離的語句。用戶可以針對這部分語句性能調優。慢查詢日誌通過

設置--log-slow_ queries[-file_ name]選項開啓後,將記錄日誌所在的路徑和名稱。MySQL系統默認的慢查詢日誌的文件名是hostname-slow.log,默認目錄也是data目錄。查看慢查詢日誌可以採用mysqldumpslow命令對慢查詢日誌進行分析。

(5) InoDB引擎在線Redo日誌: InnoDB redo Log

InnoDB引擎在線Redo日誌記錄了InnoDB所做的所有物理變更和事務信息。通過Redo日誌和Undo信息,InnoDB 大大地加強了事務的安全性。InnoDB 在線Redo日誌默認存放在data目錄下面,可以通過設置innodb. _log_ group. home. _dir 選項來更改日誌的存放位置,通過innodb. _log_ files. _in. group 選項來設置日誌的數量。

2、數據文件

MySQL數據庫會在data目錄下面建立一個以數據庫爲名字的文件夾,用來存儲數據庫中的表文件數據。不同的數據庫引擎,每個表的擴展名也不一一樣, 例如,MyISAM引擎用“.MYD"作爲擴展名,InnoDB 引擎可以用“.ibd”作爲擴展名,CSV引擎使用“.csv" 擴展名。

(1). “.frm"文件

無論是哪種存儲引擎,創建表之後就一定會生成- 一個以表名命名的“.frm"文件。fm文

件主要存放與表相關的數據信息,主要包括表結構的定義信息。當數據庫崩潰時,用戶可以通

過fm文件來恢復數據表結構。

(2).“.MYD" 文件

MyISAM存儲引擎創建表時,每-一個MyISAM類型的表都會有一個“.MYD”文件與之對應。“MYD"文件主要用來存放數據表的數據文件。

(3)“.MYI" 文件

每一個MyISAM類型的表都會有一個“.MYD"文件和-一個“.MYI"文件,對於MyISAM存儲引擎來說,可以被緩存的內容主要就是源於“.MYI”文件中,“.MYI"文件中主要用來存儲表數據文件中任何索引的數據樹。

(4)“.ibd" 文件和“.ibdata"文件

這兩種文件主要是用來存儲InnoDB 存儲引擎的數據,其中主要包括索引信息。InnoDB存儲引擎採用這兩種數據文件,主要是因爲InnoDB存儲引擎的存儲方式能夠通過配置來決定是採用共享表空間,還是採用獨享表空間的存儲方式存儲數據。

如果採用共享表空間的方式存儲數據,則會採用ibdata文件來存儲,所有的表共同使用一個或者多個ibdata 文件。如果採用獨享表空間的方式存儲數據,則會採用ibd文件來存儲。

共享表空間存儲通過innodb _data. home. dir 和innodb_ data_ file_ path兩個參數共同配置組成,innodb_ data home, dir 參數配置數據存放的總目錄,innodb data_ file_ path 參數配置每一個文件的路徑及文件名稱。如果需要添加新的ibdata文件,則需要在innodb data_ file path 參數後面配置,然後重新啓動服務器才能夠生效。

3、其他文件

MySQL數據庫系統除了日誌文件、數據文件外,還包括其他的一些文件。 例如系統配置文件、pid文件、socket 文件等等。

MySQL系統配置文件一般都在“etc/my.cnf" 中。pid 文件類似於UnixLinux操作系統下面的進程文件,MySQL服務器的pid文件用來存放自己的進程ID。MySQL 服務器啓動後,socket文件自動生成,該文件主要用來連接客戶端。

以上就是小編整理的MySQL架構簡介,只是個人的一些見解,哪裏有不準確的地方,希望各位大佬多多批評指正,咱們共同進步。

感覺小編整理的還不錯的,請多多點贊評論分享,讓更多人的看到獲益,關注小編,後續會爲大家帶來更多的內容更新,希望大家喜歡~~~

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