很多小伙伴使用了GreatSQL,但是對(duì)GreatSQL的底層原理還不是很了解,今天就帶大家一起揭開(kāi)GreatSQL體系架構(gòu)的神秘面紗!
首先來(lái)回顧一張經(jīng)典的體系架構(gòu)圖:
圖1_GreatSQL5.7 版本體系架構(gòu)圖
由此可以發(fā)現(xiàn),GreatSQL5.7 由以下幾部分組成
GreatSQL數(shù)據(jù)庫(kù)區(qū)別于其他數(shù)據(jù)庫(kù)的一個(gè)特點(diǎn)就是其可插拔的表存儲(chǔ)引擎,特別需要注意的是,存儲(chǔ)引擎是基于表的,而不是數(shù)據(jù)庫(kù)。
然而,經(jīng)典同時(shí)也意味著這幅圖已經(jīng)相當(dāng)陳舊了。在GreatSQL8.0 及更高版本中,查詢緩存這一功能已經(jīng)被移除。
圖2_GreatSQL8.0 版本體系架構(gòu)圖
總體來(lái)說(shuō),GreatSQL8.0 可以分為連接層、服務(wù)層、存儲(chǔ)引擎層。
一、連接層(Client Connectors)
連接層又名為客戶端連接器(Client Connectors)
作用是提供與GreatSQL服務(wù)器建立的支持。
客戶端通過(guò)TCP/IP協(xié)議與GreatSQL服務(wù)器建立連接,每個(gè)連接對(duì)應(yīng)一個(gè)線程。連接管理還包括了連接池技術(shù),以復(fù)用已經(jīng)建立好的連接,減少重復(fù)建立連接的開(kāi)銷。
而且?guī)缀踔С炙兄髁鞯姆?wù)端編程技術(shù),主要完成一些類似于連接處理、授權(quán)認(rèn)證、及相關(guān)的安全方案。
會(huì)對(duì)從 TCP 傳輸過(guò)來(lái)的賬號(hào)密碼做身份認(rèn)證、權(quán)限獲取
例如:
$mysql-uroot-p
ERROR1045(28000):Accessdeniedforuser'root'@'localhost'(usingpassword:NO)
- 用戶名密碼認(rèn)證通過(guò),會(huì)從權(quán)限表查出賬號(hào)擁有的權(quán)限與連接關(guān)聯(lián),之后的權(quán)限判斷邏輯,都將依賴于此時(shí)讀到的權(quán)限
二、服務(wù)層(GreatSQL Server)
服務(wù)層是GreatSQL Server的核心,主要包含連接器、分析器、優(yōu)化器、執(zhí)行器等,涵蓋 GreatSQL 的大多數(shù)核心服務(wù)功能,以及所有的內(nèi)置函數(shù)(如日期、時(shí)間、數(shù)學(xué)和加密函數(shù)等),所有跨存儲(chǔ)引擎的功能都在這一層實(shí)現(xiàn),比如存儲(chǔ)過(guò)程、觸發(fā)器、視圖等。
Ⅰ.SQL Interface: SQL接口
接收用戶的SQL命令,并且返回用戶需要查詢的結(jié)果。比如SELECT … FROM
就是調(diào)用SQL Interface
,GreatSQL支持DML、DDL、存儲(chǔ)過(guò)程、視圖、觸發(fā)器、自定義函數(shù)等多種SQL語(yǔ)言接口
同時(shí)還支持NoSQL,NoSQL泛指非關(guān)系型數(shù)據(jù)庫(kù)和數(shù)據(jù)存儲(chǔ)。隨著互聯(lián)網(wǎng)平臺(tái)的規(guī)模飛速發(fā)展,傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)已經(jīng)越來(lái)越不能滿足需求。從5.6版本開(kāi)始,GreatSQL就開(kāi)始支持簡(jiǎn)單的NoSQL存儲(chǔ)功能。GreatSQL8.0 版本對(duì)這一功能做了優(yōu)化,以更靈活的方式實(shí)現(xiàn)NoSQL功能,不再依賴模式(schema)。
Ⅱ.Parser: 解析器
在解析器中對(duì) SQL 語(yǔ)句進(jìn)行語(yǔ)法分析、語(yǔ)義分析。將 SQL 語(yǔ)句分解成數(shù)據(jù)結(jié)構(gòu),并將這個(gè)結(jié)構(gòu)傳遞到后續(xù)步驟,以后 SQL 語(yǔ)句的傳遞和處理就是基于這個(gè)結(jié)構(gòu)的,并且判斷你輸入的這個(gè) SQL 語(yǔ)句是否滿足 GreatSQL 語(yǔ)法。
Ⅲ.Optimizer: 查詢優(yōu)化器
在開(kāi)始執(zhí)行之前,還要先經(jīng)過(guò)優(yōu)化器的處理。
SQL語(yǔ)句在語(yǔ)法解析之后、查詢之前會(huì)使用查詢優(yōu)化器確定 SQL 語(yǔ)句的執(zhí)行路徑,生成一個(gè)執(zhí)行計(jì)劃,可以使用EXPLAIN
命令查看執(zhí)行計(jì)劃。
這個(gè)執(zhí)行計(jì)劃表明應(yīng)該使用哪些索引進(jìn)行查詢(全表檢索還是使用索引檢索),表之間的連接順序如何,最后會(huì)按照?qǐng)?zhí)行計(jì)劃中的步驟調(diào)用存儲(chǔ)引擎提供的方法來(lái)真正的執(zhí)行查詢,并將查詢結(jié)果返回給用戶。
例如下面的 JOIN 語(yǔ)句:
SELECT*FROMtb1JOINtb2USING(ID)WHEREtb1.a=1andtb2.a=2;
那就有兩種方法可以選擇:
-
第一種,
先取表 tb1
里 a=1 的記錄的ID值,再根據(jù) ID 關(guān)聯(lián)表 tb2 ,然后再判斷 tb2 里面 a 的值是否等于 2 -
第二種,
先取表 tb2
里面的 a=2 記錄的 ID 值,在根據(jù) ID 值關(guān)聯(lián) tb1 ,再判斷 tb1 里面 a 的值是否等于 10
執(zhí)行的結(jié)果肯定是一致的,但是效率就大不相同了,所以我們要選擇用小的數(shù)據(jù)集去驅(qū)動(dòng)大的數(shù)據(jù)集,也就是小表驅(qū)動(dòng)大表。
Ⅳ.Caches & Buffers:查詢緩存組件
GreatSQL 內(nèi)部維持著一些 Cache
和 Buffer
,比如 Query Cache
用來(lái)緩存一條 SELECT 語(yǔ)句的執(zhí)行結(jié)果,如果能夠在其中找到對(duì)應(yīng)的查詢結(jié)果,那么就不必再進(jìn)行查詢解析、優(yōu)化和執(zhí)行的整個(gè)過(guò)程了,直接將結(jié)果反饋給客戶端。
但是在 GreatSQL 8.0 版本及以上中刪除了查詢緩存功能,因?yàn)椴樵兙彺姹仨氁獌蓷lSQL語(yǔ)句完全一模一樣,否則是不能觸發(fā)查詢緩存,非常的雞肋~
三、引擎層(Storage Engines)
Ⅰ.存儲(chǔ)引擎層
真正的負(fù)責(zé)了 GreatSQL 中數(shù)據(jù)的存儲(chǔ)和提取,對(duì)物理服務(wù)器級(jí)別維護(hù)的底層數(shù)據(jù)執(zhí)行操作,服務(wù)器通過(guò)API與存儲(chǔ)引擎進(jìn)行通信。
存儲(chǔ)引擎的優(yōu)勢(shì)在于,各式各樣的存儲(chǔ)引擎都具備獨(dú)特的特性,從而能夠針對(duì)特定的應(yīng)用需求建立不同存儲(chǔ)引擎表。
GreatSQL 支持的存儲(chǔ)引擎如下:
greatsql>SHOWENGINES;
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
|Engine引擎名稱|Support支持情況|Comment引擎的說(shuō)明|Transactions事務(wù)支持|XA分布式事務(wù)支持|Savepoints保存點(diǎn)|
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
|FEDERATED|NO|FederatedMySQLstorageengine|NULL|NULL|NULL|
|PERFORMANCE_SCHEMA|YES|PerformanceSchema|NO|NO|NO|
|InnoDB|DEFAULT|Percona-XtraDB,Supportstransactions,row-levellocking,andforeignkeys|YES|YES|YES|
|MEMORY|YES|Hashbased,storedinmemory,usefulfortemporarytables|NO|NO|NO|
|MyISAM|YES|MyISAMstorageengine|NO|NO|NO|
|MRG_MYISAM|YES|CollectionofidenticalMyISAMtables|NO|NO|NO|
|BLACKHOLE|YES|/dev/nullstorageengine(anythingyouwritetoitdisappears)|NO|NO|NO|
|CSV|YES|CSVstorageengine|NO|NO|NO|
|ARCHIVE|YES|Archivestorageengine|NO|NO|NO|
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
9rowsinset(0.00sec)
得益于 GreatSQL 數(shù)據(jù)庫(kù)的開(kāi)源特性,用戶得以依據(jù)存儲(chǔ)引擎接口自行編寫個(gè)性化的存儲(chǔ)引擎。當(dāng)對(duì)某一種存儲(chǔ)引擎的性能或功能存有疑慮時(shí),可通過(guò)優(yōu)化代碼實(shí)現(xiàn)所需特性,這正展示了開(kāi)源所賦予我們的便捷與力量。
Ⅱ.存儲(chǔ)層
所有的數(shù)據(jù),數(shù)據(jù)庫(kù)、表的定義,表的每一行的內(nèi)容,索引,都是存在 文件系統(tǒng)上,以文件的方式存在的,并完成與存儲(chǔ)引擎的交互。當(dāng)然有些存儲(chǔ)引擎比如InnoDB,也支持不使用文件系統(tǒng)直接管理裸設(shè)備,但現(xiàn)代文件系統(tǒng)的實(shí)現(xiàn)使得這樣做沒(méi)有必要了。在文件系統(tǒng)之下,可以使用本地磁盤,可以使用DAS、NAS、SAN等各種存儲(chǔ)系統(tǒng)。
總結(jié)
所以可以把 GreatSQL 的架構(gòu)圖簡(jiǎn)化如下:
要把架構(gòu)圖牢牢記住,對(duì)于以后深入理解 GreatSQL 數(shù)據(jù)庫(kù)會(huì)有極大幫助!
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9218瀏覽量
85579 -
SQL
+關(guān)注
關(guān)注
1文章
766瀏覽量
44169 -
數(shù)據(jù)庫(kù)
+關(guān)注
關(guān)注
7文章
3817瀏覽量
64496
原文標(biāo)題:圖文結(jié)合帶你搞懂GreatSQL體系架構(gòu)
文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論