往期系列回顧
- 圖文結合系列之帶你搞懂MySQL日志系列
很多小伙伴使用了GreatSQL,但是對GreatSQL的底層原理還不是很了解,今天就帶大家一起揭開GreatSQL體系架構的神秘面紗!
首先來回顧一張經典的體系架構圖:

圖1_GreatSQL5.7 版本體系架構圖
由此可以發現,GreatSQL5.7 由以下幾部分組成
- 連接池組件
- 系統管理和控制工具
- SQL介面組件
- 查詢決議器
- 查詢優化器
- 快取組件
- 可插拔存盤引擎
- 系統和日志檔案
GreatSQL資料庫區別于其他資料庫的一個特點就是其可插拔的表存盤引擎,特別需要注意的是,存盤引擎是基于表的,而不是資料庫,
然而,經典同時也意味著這幅圖已經相當陳舊了,在GreatSQL8.0 及更高版本中,查詢快取這一功能已經被移除,
圖2_GreatSQL8.0 版本體系架構圖
總體來說,GreatSQL8.0 可以分為連接層、服務層、存盤引擎層,
一、連接層(Client Connectors)
連接層又名為客戶端連接器(Client Connectors)作用是提供與GreatSQL服務器建立的支持,
客戶端通過TCP/IP協議與GreatSQL服務器建立連接,每個連接對應一個執行緒,連接管理還包括了連接池技術,以復用已經建立好的連接,減少重復建立連接的開銷,
而且幾乎支持所有主流的服務端編程技術,主要完成一些類似于連接處理、授權認證、及相關的安全方案,
會對從 TCP 傳輸過來的賬號密碼做身份認證、權限獲取
- 用戶名或密碼不對,會收到
Access denied for user錯誤,客戶端程式結束執行
例如:
$ mysql -uroot -p
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
- 用戶名密碼認證通過,會從權限表查出賬號擁有的權限與連接關聯,之后的權限判斷邏輯,都將依賴于此時讀到的權限
二、服務層(GreatSQL Server)
服務層是GreatSQL Server的核心,主要包含連接器、分析器、優化器、執行器等,涵蓋 GreatSQL 的大多數核心服務功能,以及所有的內置函式(如日期、時間、數學和加密函式等),所有跨存盤引擎的功能都在這一層實作,比如存盤程序、觸發器、視圖等,
Ⅰ.SQL Interface: SQL介面
接收用戶的SQL命令,并且回傳用戶需要查詢的結果,比如SELECT … FROM就是呼叫SQL Interface,GreatSQL支持DML、DDL、存盤程序、視圖、觸發器、自定義函式等多種SQL語言介面
同時還支持NoSQL,NoSQL泛指非關系型資料庫和資料存盤,隨著互聯網平臺的規模飛速發展,傳統的關系型資料庫已經越來越不能滿足需求,從5.6版本開始,GreatSQL就開始支持簡單的NoSQL存盤功能,GreatSQL8.0 版本對這一功能做了優化,以更靈活的方式實作NoSQL功能,不再依賴模式(schema),
Ⅱ.Parser: 決議器
在決議器中對 SQL 陳述句進行語法分析、語意分析,將 SQL 陳述句分解成資料結構,并將這個結構傳遞到后續步驟,以后 SQL 陳述句的傳遞和處理就是基于這個結構的,并且判斷你輸入的這個 SQL 陳述句是否滿足 GreatSQL 語法,
Ⅲ.Optimizer: 查詢優化器
在開始執行之前,還要先經過優化器的處理,
SQL陳述句在語法決議之后、查詢之前會使用查詢優化器確定 SQL 陳述句的執行路徑,生成一個執行計劃,可以使用EXPLAIN命令查看執行計劃,
這個執行計劃表明應該使用哪些索引進行查詢(全表檢索還是使用索引檢索),表之間的連接順序如何,最后會按照執行計劃中的步驟呼叫存盤引擎提供的方法來真正的執行查詢,并將查詢結果回傳給用戶,
例如下面的 JOIN 陳述句:
SELECT * FROM tb1 JOIN tb2 USING(ID) WHERE tb1.a=1 and tb2.a=2;
那就有兩種方法可以選擇:
- 第一種,
先取表 tb1里 a=1 的記錄的ID值,再根據 ID 關聯表 tb2 ,然后再判斷 tb2 里面 a 的值是否等于 2 - 第二種,
先取表 tb2里面的 a=2 記錄的 ID 值,在根據 ID 值關聯 tb1 ,再判斷 tb1 里面 a 的值是否等于 10
執行的結果肯定是一致的,但是效率就大不相同了,所以我們要選擇用小的資料集去驅動大的資料集,也就是小表驅動大表,
Ⅳ.Caches & Buffers:查詢快取組件
GreatSQL 內部維持著一些 Cache 和 Buffer,比如 Query Cache 用來快取一條 SELECT 陳述句的執行結果,如果能夠在其中找到對應的查詢結果,那么就不必再進行查詢決議、優化和執行的整個程序了,直接將結果反饋給客戶端,
但是在 GreatSQL 8.0 版本及以上中洗掉了查詢快取功能,因為查詢快取必須要兩條SQL陳述句完全一模一樣,否則是不能觸發查詢快取,非常的雞肋~
三、引擎層(Storage Engines)
Ⅰ.存盤引擎層
真正的負責了 GreatSQL 中資料的存盤和提取,對物理服務器級別維護的底層資料執行操作,服務器通過API與存盤引擎進行通信,
存盤引擎的優勢在于,各式各樣的存盤引擎都具備獨特的特性,從而能夠針對特定的應用需求建立不同存盤引擎表,
GreatSQL 支持的存盤引擎如下:
greatsql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| Engine 引擎名稱 | Support 支持情況 | Comment 引擎的說明 | Transactions 事務支持 | XA 分布式事務支持 | Savepoints 保存點 |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| InnoDB | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
得益于 GreatSQL 資料庫的開源特性,用戶得以依據存盤引擎介面自行撰寫個性化的存盤引擎,當對某一種存盤引擎的性能或功能存有疑慮時,可通過優化代碼實作所需特性,這正展示了開源所賦予我們的便捷與力量,
Ⅱ.存盤層
所有的資料,資料庫、表的定義,表的每一行的內容,索引,都是存在 檔案系統上,以檔案的方式存在的,并完成與存盤引擎的互動,當然有些存盤引擎比如InnoDB,也支持不使用檔案系統直接管理裸設備,但現代檔案系統的實作使得這樣做沒有必要了,在檔案系統之下,可以使用本地磁盤,可以使用DAS、NAS、SAN等各種存盤系統,
總結
所以可以把 GreatSQL 的架構圖簡化如下:

要把架構圖牢牢記住,對于以后深入理解 GreatSQL 資料庫會有極大幫助!
Enjoy GreatSQL ??
關于 GreatSQL
GreatSQL是由萬里資料庫維護的MySQL分支,專注于提升MGR可靠性及性能,支持InnoDB并行查詢特性,是適用于金融級應用的MySQL分支版本,
相關鏈接: GreatSQL社區 Gitee GitHub Bilibili
GreatSQL社區:
社區博客有獎征稿詳情:https://greatsql.cn/thread-100-1-1.html

技術交流群:
微信:掃碼添加
GreatSQL社區助手微信好友,發送驗證資訊加群,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/556182.html
標籤:其他
下一篇:返回列表
