MySQL Server
架構(gòu)自頂向下大致可以分 網(wǎng)絡(luò)連接層
、服務(wù)層
、存儲引擎層
和 系統(tǒng)文件層
。
1. 網(wǎng)絡(luò)連接層
-
客戶端連接器(Client Connectors)
:提供與MySQL
服務(wù)器建立的支持顺饮。目前幾乎支持所有主流的服務(wù)端編程技術(shù),例如常見的Java凌那、C兼雄、Python、.NET
等帽蝶,它們通過各自API
技術(shù)與MySQL
建立連接赦肋。
2. 服務(wù)層(MySQL Server)
服務(wù)層是MySQL Server
的核心,主要包含系統(tǒng)管理和控制工具
、連接池
佃乘、SQL接口
局蚀、解析器
、查詢優(yōu)化器
和緩存
六個部分恕稠。
-
連接池(Connection Pool)
:負責存儲和管理客戶端與數(shù)據(jù)庫的連接琅绅,一個線程負責管理一個連接。 -
系統(tǒng)管理和控制工具(Management Services & Utilities)
:例如備份恢復(fù)鹅巍、安全管理千扶、集群管理等 -
SQL接口(SQL Interface)
:用于接受客戶端發(fā)送的各種SQL
命令,并且返回用戶需要查詢的結(jié)果骆捧。比如DML
澎羞、DDL
、存儲過程敛苇、視圖妆绞、觸發(fā)器等。 -
解析器(Parser)
:負責將請求的SQL
解析生成一個"解析樹"枫攀。然后根據(jù)一些MySQL
規(guī)則進一步檢查解析樹是否合法括饶。 -
查詢優(yōu)化器(Optimizer)
:當“解析樹”通過解析器語法檢查后,將交由優(yōu)化器將其轉(zhuǎn)化成執(zhí)行計劃来涨,然后與存儲引擎交互图焰。
select uid,name from user where gender=1;
選取 > 投影 > 聯(lián)接 策略
1)select 先根據(jù) where 語句進行選取,并不是查詢出全部數(shù)據(jù)再過濾
2)select 查詢根據(jù) uid 和 name 進行屬性投影蹦掐,并不是取出所有字段
3)將前面選取和投影聯(lián)接起來最終生成查詢結(jié)果
-
緩存(Cache & Buffer)
:緩存機制是由一系列小緩存組成的
技羔。比如表緩存
,記錄緩存
卧抗,權(quán)限緩存
藤滥,引擎緩存
等。如果查詢緩存有命中的查詢結(jié)果社裆,查詢語句就可以直接去查詢緩存中取數(shù)據(jù)拙绊。
3. 存儲引擎層(Pluggable Storage Engines)
存儲引擎負責MySQL
中數(shù)據(jù)的存儲與提取,與底層系統(tǒng)文件進行交互浦马。MySQL
存儲引擎是插件式的时呀,服務(wù)器中的查詢執(zhí)行引擎通過接口與存儲引擎進行通信,接口屏蔽了不同存儲引擎之間的差異 【現(xiàn)在有很多種存儲引擎谨娜,各有各的特點,最常見的是MyISAM
和InnoDB
磺陡。
4. 系統(tǒng)文件層(File System)
該層負責將數(shù)據(jù)庫的數(shù)據(jù)和日志存儲在文件系統(tǒng)之上趴梢,并完成與存儲引擎的交互漠畜,是文件的物理存儲層。主要包含日志文件
坞靶,數(shù)據(jù)文件
憔狞,配置文件
,pid 文件
彰阴,socket 文件
等瘾敢。
4.1 日志文件
- 錯誤日志(Error log)
默認開啟
SHOW VARIABLES LIKE '%log_error%'
- 通用查詢?nèi)罩荆℅eneral query log)
記錄一般查詢語句
SHOW VARIABLES LIKE '%general%'
- 二進制日志(binary log)
記錄了對MySQL
數(shù)據(jù)庫執(zhí)行的更改操作,并且記錄了語句的發(fā)生時間尿这、執(zhí)行時長簇抵;但是它不記錄select、show等
不修改數(shù)據(jù)庫的SQL
射众。主要用于數(shù)據(jù)庫恢復(fù)和主從復(fù)制碟摆。
SHOW VARIABLES LIKE '%log_bin%'; // 是否開啟
SHOW VARIABLES LIKE '%binlog%'; // 參數(shù)查看
SHOW BINARY LOGS; // 查看日志文件
- 慢查詢?nèi)罩荆⊿low query log)
記錄所有執(zhí)行時間超時的查詢SQL,默認是10秒
叨橱。
SHOW VARIABLES LIKE '%slow_query%'; // 是否開啟
SHOW VARIABLES LIKE '%long_query_time%'; // 時長
SET long_query_time = 5; // 設(shè)置慢查詢時長
4.2 配置文件
用于存放 MySQL
所有的配置信息文件典蜕,比如my.cnf、my.ini等罗洗。
4.3 數(shù)據(jù)文件
查看數(shù)據(jù)存儲所在位置
SHOW VARIABLES LIKE '%datadir%'; // 查看數(shù)據(jù)文件所在位置
- db.opt 文件:記錄這個庫的默認使用的字符集和校驗規(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
日志文件榜田。
4.4 pid 文件
pid 文件
是 mysqld
應(yīng)用程序在 Unix/Linux 環(huán)境下的一個進程文件,和許多其他 Unix/Linux 服務(wù)端程序一樣锻梳,它存放著自己的進程 id箭券。
4.5 socket 文件
socket 文件
也是在 Unix/Linux 環(huán)境下才有的,用戶在 Unix/Linux 環(huán)境下客戶端連接可以不通過 TCP/IP
網(wǎng)絡(luò)而直接使用 Unix Socket
來連接 MySQL
疑枯。