柚子快報(bào)激活碼778899分享:adb MySQL的體系架構(gòu)
柚子快報(bào)激活碼778899分享:adb MySQL的體系架構(gòu)
文章目錄
前言MySQL的Server層MySQL的存儲(chǔ)引擎1)InnoDB 存儲(chǔ)引擎2)MyISAM 存儲(chǔ)引擎3)Memory 存儲(chǔ)引擎
前言
在學(xué)習(xí)一種事務(wù)之前,我們需要先了解事物的基本組成結(jié)構(gòu),清楚了事物的基本組成結(jié)構(gòu)之后,我們才能更深入的了解相關(guān)操作,那么今天我將為大家介紹MySQL的體系架構(gòu)。
MySQL數(shù)據(jù)庫(kù)的服務(wù)端主要分為Server層和存儲(chǔ)引擎層,接下來(lái)我將以這兩層為著重點(diǎn)為大家介紹MySQL的體系架構(gòu)。
MySQL的Server層
MySQL的Server層照顧要有七個(gè)組件:
MySQL 向外提供的交互接口(Connectors)連接池組件(Connection Pool)管理服務(wù)組件和工具組件(Management Service & Utilities)SQL 接口組件(SQL Interface)查詢分析器組件(Parser)優(yōu)化器組件(Optimizer)查詢緩存組件(Query Caches & Buffers)
1)MySQL向外提供的交互接口(Connectors) Connectors 組件是 MySQL 向外提供的交互組件,如Java,.NET,PHP等語(yǔ)言可以通過(guò)該組件來(lái)操作 MySQL 語(yǔ)句,實(shí)現(xiàn)與 MySQL 的交互。建立連接之后,可以通過(guò)show processlist 語(yǔ)句來(lái)查看已經(jīng)建立的連接。 如果客戶端一段時(shí)間內(nèi)沒(méi)有活躍行為,那么連接器在默認(rèn)的8個(gè)小時(shí)后會(huì)主動(dòng)斷開(kāi)連接。加果在連接被斷開(kāi)之后,客戶端再次發(fā)送請(qǐng)求的話,就會(huì)收到一個(gè)錯(cuò)誤提醒:Lost connection to MySQL server during query。
客戶端連接到MySQL數(shù)據(jù)庫(kù)上時(shí),根據(jù)連接時(shí)間的長(zhǎng)短可以分為:短連接和長(zhǎng)連接。短連接比較簡(jiǎn)單,指每次查詢之后會(huì)斷開(kāi),再次查詢需要重新建立連接,因此使用短連接的成本較高;長(zhǎng)連接指長(zhǎng)時(shí)間連接到MySOL數(shù)據(jù)庫(kù)上并執(zhí)行數(shù)據(jù)庫(kù)操作,因此長(zhǎng)連接會(huì)導(dǎo)致出現(xiàn)內(nèi)存溢出的問(wèn)題從而使MySQL異常重啟。
在使用長(zhǎng)連接時(shí),可以使用客戶端函數(shù)mysql_reset_connection()來(lái)重新初始化連接資源。這個(gè)過(guò)程不需要重連和重新做權(quán)限驗(yàn)證,但是會(huì)將連接恢復(fù)到剛剛創(chuàng)建完時(shí)的狀態(tài)。
2)連接池組件(Connection Pool)
負(fù)責(zé)監(jiān)聽(tīng)客戶端向MySQL服務(wù)器端的各種請(qǐng)求,接收請(qǐng)求、轉(zhuǎn)發(fā)請(qǐng)求到目標(biāo)模塊。每個(gè)成功連接MySQL服務(wù)器端的客戶請(qǐng)求都會(huì)被創(chuàng)建或分配一個(gè)線程,該線程負(fù)責(zé)客戶端與MySQL服務(wù)器端的通信,接收客戶端發(fā)送的命令,傳遞服務(wù)器端的結(jié)果信息等。
3)管理服務(wù)組件和工具組件(Management Service &Utilities)
提供對(duì)MySOL的集成管理,如備份(Backup)、恢復(fù)(Recovery)、安全管理(Security)等。
4)SQL接口組件(SQL Interface)
接收用戶SQL命令,如DML、DDL和存儲(chǔ)過(guò)程等,并將最終結(jié)果返回給用戶。
5)查詢分析器組件(Parser)
系統(tǒng)在執(zhí)行輸入語(yǔ)句之前,必須分析出語(yǔ)句想要干什么。例如:首先通過(guò)select關(guān)鍵字得知這是一條查詢命令,還包括分析要查詢的是哪張表以及查詢條件是什么。同時(shí),分析器必須分析輸入語(yǔ)句的語(yǔ)法正確性。如果SQL中存在語(yǔ)法的錯(cuò)誤,則查詢分析器組件將返回提示信息“You have an error in your SQL syntax”。
6)優(yōu)化器組件(Optimizer)
優(yōu)化器是MySQL用來(lái)對(duì)輸人語(yǔ)句在執(zhí)行之前所做的最后一步優(yōu)化。優(yōu)化內(nèi)容包括:是否選擇索引、選擇哪個(gè)索引、多表查詢的聯(lián)合順序等。每一種執(zhí)行方法的邏輯結(jié)果是一樣的,但是執(zhí)行的效率會(huì)有不同,而優(yōu)化器的作用就是決定選擇使用哪一種方案。
7)查詢緩存組件(Query Caches & Buffers) 這個(gè)查詢緩存是比較容易理解的。在每一次查詢時(shí),MySQL 都先去看看是否命中緩存,命中則直接返回,提高了系統(tǒng)的響應(yīng)速度。但是這個(gè)功能有一個(gè)相當(dāng)大的弊病,那就是一旦這個(gè)表中數(shù)據(jù)發(fā)生更改,那么這張表對(duì)應(yīng)的所有緩存都會(huì)失效。
對(duì)于更新壓力大的數(shù)據(jù)庫(kù)來(lái)說(shuō),查詢緩存的命中率會(huì)非常低。除非業(yè)務(wù)系統(tǒng)就只有一張靜態(tài)表,很長(zhǎng)時(shí)間才會(huì)更新一次。比如,一個(gè)系統(tǒng)配置表,那這張表上的查詢才適合使用查詢緩存。所以在生產(chǎn)系統(tǒng)中,建議關(guān)閉該功能。
在MySQL8.0版本之前,可以通過(guò)將參數(shù)“query_cachetype”設(shè)置成OFF,來(lái)關(guān)閉查詢緩存的功能。但是在MySQL8.0版本之后,直接刪掉了這部分的功能。
show variables like '% query_cache% ';
MySQL的存儲(chǔ)引擎
MySQL 存儲(chǔ)引擎層負(fù)責(zé)數(shù)據(jù)的存儲(chǔ)和提取,其架構(gòu)模式是插件式的,支持InnoDB、MyISAM、Memory、Archive、NDB Cluster等多個(gè)存儲(chǔ)引擎。最常用的是InnoDB,我將為大家詳細(xì)介紹InnoDb、MyISAM 和 Mymery 存儲(chǔ)引擎。
我們可以使用 show create table 表名; 來(lái)查看創(chuàng)建表時(shí)使用的存儲(chǔ)引擎。
create table test (id int);
show create table test;
1)InnoDB 存儲(chǔ)引擎
InnoDB是MySQL的默認(rèn)存儲(chǔ)引擎,它支持ACID(原子性、一致性、隔離性和持久性)事務(wù),并提供了行級(jí)鎖定、外鍵約束和崩潰恢復(fù)等功能。它適用于大多數(shù)應(yīng)用場(chǎng)景,特別是需要事務(wù)支持和高并發(fā)讀寫(xiě)操作的應(yīng)用。
它具有以下特性:
事務(wù)支持:InnoDB引擎支持事務(wù)的ACID屬性,確保了數(shù)據(jù)的原子性、一致性、隔離性和持久性。這意味著可以使用BEGIN、COMMIT和ROLLBACK語(yǔ)句來(lái)管理事務(wù),保證數(shù)據(jù)的完整性和一致性。行級(jí)鎖定:InnoDB使用行級(jí)鎖來(lái)處理并發(fā)訪問(wèn)和修改數(shù)據(jù),而不是表級(jí)鎖。這意味著多個(gè)事務(wù)可以同時(shí)訪問(wèn)同一表的不同行,提高了并發(fā)性能和并發(fā)控制。外鍵約束:InnoDB支持外鍵約束,可以在數(shù)據(jù)庫(kù)層面實(shí)現(xiàn)數(shù)據(jù)的一致性和完整性。它提供了CASCADE、RESTRICT和SET NULL等選項(xiàng)來(lái)處理外鍵關(guān)系。崩潰恢復(fù):InnoDB具有崩潰恢復(fù)的能力,即使在系統(tǒng)崩潰或電源故障的情況下,也可以保證數(shù)據(jù)的完整性。它通過(guò)事務(wù)日志(redo log)來(lái)恢復(fù)未完成的事務(wù)和恢復(fù)已提交的事務(wù)。自動(dòng)增長(zhǎng)列:InnoDB支持自動(dòng)增長(zhǎng)列,可以為表中的某一列指定自動(dòng)遞增的整數(shù)值,簡(jiǎn)化了數(shù)據(jù)插入操作?;貪L段:InnoDB通過(guò)回滾段(Rollback Segment)來(lái)存儲(chǔ)未提交事務(wù)的數(shù)據(jù),以便在需要時(shí)進(jìn)行回滾操作??梢栽诰€熱備份:InnoDB引擎支持在線熱備份,可以在不停止MySQL服務(wù)器的情況下備份數(shù)據(jù)庫(kù)。支持MVCC(多版本并發(fā)控制):InnoDB使用多版本并發(fā)控制來(lái)處理并發(fā)事務(wù),在讀操作的同時(shí)允許寫(xiě)操作,并通過(guò)行版本來(lái)實(shí)現(xiàn)數(shù)據(jù)的隔離性和一致性。高性能:InnoDB引擎通過(guò)使用緩沖池(Buffer Pool)來(lái)緩存熱門(mén)數(shù)據(jù)和索引,提高讀取數(shù)據(jù)的性能。
2)MyISAM 存儲(chǔ)引擎
MyISAM是MySQL的另一個(gè)常見(jiàn)的存儲(chǔ)引擎,它不支持事務(wù)和行級(jí)鎖定,但具有良好的性能。MyISAM適用于主要是讀取操作的應(yīng)用,如數(shù)據(jù)倉(cāng)庫(kù)、歸檔和非事務(wù)性的應(yīng)用。
它具有以下特性:
快速讀取速度:MyISAM存儲(chǔ)引擎在讀取數(shù)據(jù)時(shí)非常高效,對(duì)于主要是讀取操作的應(yīng)用性能表現(xiàn)較好。這是因?yàn)镸yISAM表以表級(jí)鎖定的方式處理并發(fā),讀操作可以并發(fā)執(zhí)行,不會(huì)有行級(jí)鎖定帶來(lái)的爭(zhēng)用。支持全文索引:MyISAM存儲(chǔ)引擎對(duì)全文索引提供了良好的支持,可以通過(guò)創(chuàng)建全文索引提供高效的文本搜索能力。節(jié)省磁盤(pán)空間:相較于InnoDB存儲(chǔ)引擎,MyISAM通常在磁盤(pán)占用方面更加節(jié)省空間,這是因?yàn)樗恢С质聞?wù)、行級(jí)鎖定和崩潰恢復(fù)等功能,減少了存儲(chǔ)額外的元數(shù)據(jù)和日志。表級(jí)鎖定:MyISAM存儲(chǔ)引擎使用表級(jí)鎖定,這意味著一個(gè)寫(xiě)操作鎖定整個(gè)表,因此在寫(xiě)操作頻繁的情況下可能會(huì)導(dǎo)致并發(fā)性能下降。不支持事務(wù)和外鍵:MyISAM存儲(chǔ)引擎不支持事務(wù)操作,也不支持外鍵約束。這意味著在使用MyISAM時(shí),你無(wú)法使用BEGIN、COMMIT和ROLLBACK等事務(wù)操作,也無(wú)法定義外鍵約束來(lái)維護(hù)數(shù)據(jù)的完整性。不支持崩潰恢復(fù):MyISAM存儲(chǔ)引擎沒(méi)有崩潰恢復(fù)的能力,這意味著如果MySQL服務(wù)器在寫(xiě)操作過(guò)程中崩潰,可能會(huì)導(dǎo)致數(shù)據(jù)的不一致。自動(dòng)維護(hù)索引統(tǒng)計(jì)信息:MyISAM存儲(chǔ)引擎會(huì)自動(dòng)維護(hù)表的索引統(tǒng)計(jì)信息,這些統(tǒng)計(jì)信息用于優(yōu)化查詢執(zhí)行計(jì)劃。多用途:MyISAM存儲(chǔ)引擎適用于主要是讀取操作的應(yīng)用場(chǎng)景,如報(bào)表、日志分析和靜態(tài)網(wǎng)站等。
我們可以在創(chuàng)建表的時(shí)候指定存儲(chǔ)引擎。
create table 表名 ( ) engine = 存儲(chǔ)引擎名
create table test1 (id int) engine = myisam;
show create table test1;
正是因?yàn)?MyISAM 存儲(chǔ)引擎的這些特性,它適合于以下場(chǎng)景:
不需要事務(wù)支持的場(chǎng)景讀多或者寫(xiě)多的單一業(yè)務(wù)場(chǎng)景,讀寫(xiě)頻繁的則不合適讀寫(xiě)并發(fā)訪問(wèn)較低的業(yè)務(wù)數(shù)據(jù)修改相對(duì)較少的業(yè)務(wù)以讀為主的業(yè)務(wù)對(duì)數(shù)據(jù)的一致性要求不是很高的業(yè)務(wù)服務(wù)器硬件資源相對(duì)比較差的環(huán)境
3)Memory 存儲(chǔ)引擎
Memeory 存儲(chǔ)引擎將表中的數(shù)據(jù)存儲(chǔ)在內(nèi)存中,而不是磁盤(pán)上,也就是說(shuō)如果重啟MySQL 或者關(guān)閉,此時(shí)的數(shù)據(jù)將會(huì)丟失。
create table test2 (id int,name varchar(20)) engine = memory;
show create table test2;
insert into test2 values (1,'zhangsan');
select * from test2;
# 重啟MySQL
systemctl restart mysqld
select * from test2;
輸出信息
Empty set (0.00 sec)
Memory 存儲(chǔ)引擎具有以下特點(diǎn):
高速讀寫(xiě):由于數(shù)據(jù)存儲(chǔ)在內(nèi)存中,Memory 存儲(chǔ)引擎提供非??焖俚淖x取和寫(xiě)入性能。相比于其他存儲(chǔ)引擎,它可以更快地執(zhí)行查詢和寫(xiě)入操作。臨時(shí)數(shù)據(jù)和緩存表:由于數(shù)據(jù)存儲(chǔ)在內(nèi)存中,Memory 存儲(chǔ)引擎對(duì)于處理臨時(shí)數(shù)據(jù)和緩存表非常有效。如果你需要在查詢過(guò)程中創(chuàng)建一些臨時(shí)數(shù)據(jù),并且它們?cè)诓樵兘Y(jié)束后不再需要,那么 Memory 引擎是一個(gè)不錯(cuò)的選擇。高速緩存索引:Memory 存儲(chǔ)引擎對(duì)索引查詢非常快速,因?yàn)樗饕龜?shù)據(jù)完全存儲(chǔ)在內(nèi)存中,減少了磁盤(pán)I/O的開(kāi)銷(xiāo)。不持久化:Memory 引擎的數(shù)據(jù)不會(huì)持久化到磁盤(pán)上,一旦 MySQL 服務(wù)器重啟或關(guān)閉,存儲(chǔ)在 Memory 引擎中的數(shù)據(jù)就會(huì)丟失。因此,Memory 存儲(chǔ)引擎適合于處理非持久化的數(shù)據(jù),并且可以在服務(wù)器重新啟動(dòng)后重新加載數(shù)據(jù)。適用于小規(guī)模數(shù)據(jù):由于數(shù)據(jù)存儲(chǔ)在內(nèi)存中,Memory 存儲(chǔ)引擎的容量受限于可用的內(nèi)存大小。它不適合用于處理大規(guī)模數(shù)據(jù)集,因?yàn)閮?nèi)存可能會(huì)成為限制因素。不支持事務(wù)和崩潰恢復(fù):Memory 存儲(chǔ)引擎不支持事務(wù),也不支持崩潰恢復(fù)。因此,在使用 Memory 存儲(chǔ)引擎時(shí)需要注意數(shù)據(jù)的一致性和持久性。
柚子快報(bào)激活碼778899分享:adb MySQL的體系架構(gòu)
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。