MySQL數(shù)據(jù)庫架構(gòu)
MySQL架構(gòu)自頂向下大致可以分為連接層 , SQL層 , 存儲引擎層 , 物理文件層。架構(gòu)如下
連接層
-- 查看最大連接數(shù)
show variables like '%max_connections%';
客戶端連接器,MySQL向外提供交互接口連接各種不同的客戶端。
- 客戶端/應(yīng)用程序:客戶端是與MySQL系統(tǒng)進行交互的組件,它可以是命令行工具、圖形用戶界面 (GUI) 或各種編程語言中的數(shù)據(jù)庫連接庫??蛻舳素?fù)責(zé)發(fā)送SQL查詢請求給MySQL服務(wù)器,并接收返回的結(jié)果。
- 連接管理器:連接管理器負(fù)責(zé)處理客戶端連接請求。它接收來自客戶端的連接請求,并將它們分配給MySQL服務(wù)器線程池中的可用線程。連接管理器還負(fù)責(zé)驗證用戶的身份、管理連接池和控制連接數(shù)等。
特點:
(1)提供連接協(xié)議:TCP/IP 、SOCKET
(2)提供驗證:用戶、密碼,IP,SOCKET
(3)提供專用連接線程:接收用戶SQL,返回結(jié)果
通過以下語句可以查看到連接線程基本情況
mysql> show processlist;
SQL層
MySQL的核心,主要分為連接池(Connection Pool) , 系統(tǒng)管理和控制工具(Management Serveices & Utilities) , SQL接口(SQL Interface) , 解析器(Parser) , 查詢優(yōu)化器(Optimizer) , 查詢緩存(Caches&Buffers)。
-
連接池(Connection Pool)
負(fù)責(zé)存儲和管理客戶端與數(shù)據(jù)庫的連接,一個線程負(fù)責(zé)管理一個連接。
在服務(wù)器內(nèi)部,每個client連接都有自己的線程。這個連接的查詢都在一個單獨的線程中執(zhí)行。這些線程輪流運行在某一個CPU內(nèi)核(多核CPU)或者CPU中。服務(wù)器緩存了線程,因此不需要為每個client連接單獨創(chuàng)建和銷毀線程 。
-
**系統(tǒng)管理和控制工具(Management Serveices & Utilities) **
備份恢復(fù)、安全管理、集群管理等
-
SQL接口(SQL Interface)
用于接受客戶端發(fā)送的SQL命令,并且返回查詢的結(jié)果。
例如:DDL,DML,DCL,DQL等
-
解析器(Parser)
SQL命令傳遞到解析器的時候會被解析器驗證和解析。
-
查詢優(yōu)化器(Optimizer)
SQL語句在查詢之前會使用查詢優(yōu)化器對查詢進行優(yōu)化。(當(dāng)【解析樹】通過解析器語法檢查后,將交由優(yōu)化器將其轉(zhuǎn)化成執(zhí)行計劃與存儲引擎交互。一般執(zhí)行sql腳本會遵循【選取–>投影–>聯(lián)接】的策略)
-
查詢緩存(Caches&Buffers)
如果查詢緩存有命中的查詢結(jié)果,查詢語句就可以直接去查詢緩存中取數(shù)據(jù).
# 查詢緩存配置情況
show variables like '%query_cache%';
- 接收上層傳送的SQL語句
- 語法驗證模塊:驗證語句語法,是否滿足SQL_MODE
- 語義檢查:判斷SQL語句的類型
DDL :數(shù)據(jù)定義語言
DCL :數(shù)據(jù)控制語言
DML :數(shù)據(jù)操作語言
DQL: 數(shù)據(jù)查詢語言
… - 權(quán)限檢查:用戶對庫表有沒有權(quán)限
- 解析器:對語句執(zhí)行前,進行預(yù)處理,生成解析樹(執(zhí)行計劃),說白了就是生成多種執(zhí)行方案.
- 優(yōu)化器:根據(jù)解析器得出的多種執(zhí)行計劃,進行判斷,選擇最優(yōu)的執(zhí)行計劃
代價模型:資源(CPU IO MEM)的耗損評估性能好壞 - 執(zhí)行器:根據(jù)最優(yōu)執(zhí)行計劃,執(zhí)行SQL語句,產(chǎn)生執(zhí)行結(jié)果
執(zhí)行結(jié)果:在磁盤的xxxx位置上 - 提供查詢緩存(默認(rèn)是沒開啟的),會使用redis tair替代查詢緩存功能
- 提供日志記錄(日志管理章節(jié)):binlog,默認(rèn)是沒開啟的。
存儲引擎層
負(fù)責(zé)根據(jù)SQL層執(zhí)行的結(jié)果,從磁盤上拿數(shù)據(jù)。將16進制的磁盤數(shù)據(jù),交由SQL結(jié)構(gòu)化化成表,連接層的專用線程返回給用戶。
物理文件層
主要是將數(shù)據(jù)和日志存儲在運行設(shè)備的文件系統(tǒng)之上,并完成于存儲引擎的交互,是文件的物理存儲層。 主要包含日志文件,數(shù)據(jù)文件,配置文件,pid 文件,socket 文件等。
-
日志文件
-
錯誤日志
show variables like '%log_error%' --默認(rèn)開啟
-
二進制日志
記錄對數(shù)據(jù)庫執(zhí)行的操作 , 如:更改操作,語句的發(fā)生時間,執(zhí)行時長。主要用于數(shù)據(jù)庫恢復(fù)和主從復(fù)制。(不記錄select,show等不修改數(shù)據(jù)庫的SQL)
show variables like '%log_bin%'; --是否開啟 show variables like '%binlog%'; --參數(shù)查看 show binary logs;--查看日志文件
-
通用查詢?nèi)罩?/p>
show variables like '%general%';--記錄一般查詢語句
-
慢查詢?nèi)罩?/p>
記錄所有執(zhí)行時間超時的查詢SQL,默認(rèn)是10秒。
show variables like '%slow_query%'; //是否開啟 show variables like '%long_query_time%'; //超時時間
-
事務(wù)日志
包含重做日志和撤銷日志
-
-
數(shù)據(jù)文件
-
db.opt 文件
記錄當(dāng)前庫默認(rèn)使用的字符集和校驗規(guī)則。
-
frm 文件
存儲與表相關(guān)的元數(shù)據(jù)(meta)信息,包括表結(jié)構(gòu)的定義信息等,每一張表都會有一個frm 文件。
-
MYD 文件
MyISAM 存儲引擎專用,存放 MyISAM 表的數(shù)據(jù)(data),每一張表都會有一個.MYD 文件。
-
MYI 文件
MyISAM 存儲引擎專用,存放 MyISAM 表的索引相關(guān)信息,每一張 MyISAM 表對應(yīng)一個 .MYI 文件。
-
ibd文件和 IBDATA 文件
存放 InnoDB 的數(shù)據(jù)文件(包括索引)。InnoDB 存儲引擎有兩種表空間方式:獨享表空間和共享表空間。
獨享表空間使用 .ibd 文件來存放數(shù)據(jù),且每張InnoDB 表對應(yīng)一個 .ibd 文件。
共享表空間使用 .ibdata 文件,所有表共同使用一個(或多個,自行配置).ibdata 文件。
-
ibdata1 文件
系統(tǒng)表空間數(shù)據(jù)文件,存儲表元數(shù)據(jù)、Undo日志等 。
-
ib_logfile0、ib_logfile1 文件
Redo log 日志文件。
-
-
配置文件
用于存放MySQL所有的配置信息文件,比如my.cnf、my.ini等。
-
pid文件
pid 文件是 mysqld 應(yīng)用程序在 Unix/Linux 環(huán)境下的一個進程文件,和許多其他 Unix/Linux 服務(wù)端程序一樣,存放著自己的進程 id。
-
socket文件文章來源:http://www.zghlxwxcb.cn/news/detail-537707.html
socket 文件也是在 Unix/Linux 環(huán)境下才有的,用戶在 Unix/Linux 環(huán)境下客戶端連接可以不通過TCP/IP 網(wǎng)絡(luò)而直接使用 Unix Socket 來連接 MySQL。文章來源地址http://www.zghlxwxcb.cn/news/detail-537707.html
pid 文件是 mysqld 應(yīng)用程序在 Unix/Linux 環(huán)境下的一個進程文件,和許多其他 Unix/Linux 服務(wù)端程序一樣,存放著自己的進程 id。
-
socket文件
socket 文件也是在 Unix/Linux 環(huán)境下才有的,用戶在 Unix/Linux 環(huán)境下客戶端連接可以不通過TCP/IP 網(wǎng)絡(luò)而直接使用 Unix Socket 來連接 MySQL。
到了這里,關(guān)于MySQL數(shù)據(jù)庫架構(gòu)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!