對(duì)于初學(xué)者可能MySQL是設(shè)計(jì)框架不是很了解,而其實(shí)在了解內(nèi)存結(jié)構(gòu)等。下面小編就為大家分享下MySQL的設(shè)計(jì)架構(gòu),一起來看一下吧。
在使用Impala這種所謂大數(shù)據(jù)引擎的時(shí)候,總會(huì)感覺有些地方設(shè)計(jì)的不是那么盡善盡美,比如說緩存,Impala的查詢結(jié)果是沒有經(jīng)過緩存的,也就是說每次都相當(dāng)于需要重新對(duì)文件執(zhí)行一遍查詢。
MySQL基本架構(gòu)如下圖,是MySQL的邏輯架構(gòu)圖:
最上層的服務(wù)并不是MySQL所獨(dú)有的,大多數(shù)基于網(wǎng)絡(luò)的客戶端/服務(wù)器的工具或者服務(wù)都有類似的架構(gòu),比如連接處理、授權(quán)認(rèn)證、安全等等。
第二層架構(gòu)是MySQL比較有意思的部分大多數(shù)MySQL的核心服務(wù)功能都在這一層。包括查詢解析、分析、優(yōu)化、緩存以及所有的內(nèi)置函數(shù),所有跨存儲(chǔ)引擎的功能都在這一層實(shí)現(xiàn):存儲(chǔ)過程、觸發(fā)器、視圖等。
第三層包含了存儲(chǔ)引擎。存儲(chǔ)引擎負(fù)責(zé)MySQL中數(shù)據(jù)的存儲(chǔ)和提取。和GNU/Linux下的各種文件系統(tǒng)一樣,每個(gè)存儲(chǔ)引擎都有它的優(yōu)勢(shì)和劣勢(shì)。服務(wù)器通過API與存儲(chǔ)引擎進(jìn)行通信。這些接口屏蔽了不同存儲(chǔ)引擎之間的差異。
下面挑幾個(gè)模塊解釋一下:
1.解析器
SQL命令傳遞到解析器的時(shí)候會(huì)被解析器驗(yàn)證和解析。解析器是由Lex和YACC實(shí)現(xiàn)的,是一個(gè)很長(zhǎng)的腳本。
主要功能:
將SQL語句分解成數(shù)據(jù)結(jié)構(gòu),并將這個(gè)結(jié)構(gòu)傳遞到后續(xù)步驟,以后SQL語句的傳遞和處理就是基于這個(gè)結(jié)構(gòu)的
如果在分解構(gòu)成中遇到錯(cuò)誤,那么就說明這個(gè)sql語句是不合理的
2.優(yōu)化器
SQL語句在查詢之前會(huì)使用查詢優(yōu)化器對(duì)查詢進(jìn)行優(yōu)化。他使用的是“選取-投影-聯(lián)接”策略進(jìn)行查詢。
用一個(gè)例子就可以理解:select uid,name from user where gender = 1;
這個(gè)select 查詢先根據(jù)where 語句進(jìn)行選取,而不是先將表全部查詢出來以后再進(jìn)行g(shù)ender過濾
這個(gè)select查詢先根據(jù)uid和name進(jìn)行屬性投影,而不是將屬性全部取出以后再進(jìn)行過濾
將這兩個(gè)查詢條件聯(lián)接起來生成最終查詢結(jié)果。
3.緩存
如果查詢緩存有命中的查詢結(jié)果,查詢語句就可以直接去查詢緩存中取數(shù)據(jù)。
這個(gè)緩存機(jī)制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權(quán)限緩存等。
補(bǔ)充知識(shí)
1.查詢優(yōu)化和執(zhí)行(Optimization and Execution)
MySQL將用戶的查詢語句進(jìn)行解析,并創(chuàng)建一個(gè)內(nèi)部的數(shù)據(jù)結(jié)構(gòu)——分析樹,然后進(jìn)行各種優(yōu)化,例如重寫查詢、選擇讀取表的順序,以及使用哪個(gè)索引等。
查詢優(yōu)化器不關(guān)心一個(gè)表所使用的存儲(chǔ)引擎,但是存儲(chǔ)引擎會(huì)影響服務(wù)器如何優(yōu)化查詢。優(yōu)化器通過存儲(chǔ)引擎獲取一些參數(shù)、某個(gè)操作的執(zhí)行代價(jià)、以及統(tǒng)計(jì)信息等。在解析查詢之前,服務(wù)器會(huì)先訪問查詢緩存(query cache)——它存儲(chǔ)SELECT語句以及相應(yīng)的查詢結(jié)果集。如果某個(gè)查詢結(jié)果已經(jīng)位于緩存中,服務(wù)器就不會(huì)再對(duì)查詢進(jìn)行解析、優(yōu)化、以及執(zhí)行。它僅僅將緩存中的結(jié)果返回給用戶即可,這將大大提高系統(tǒng)的性能。
2.并發(fā)控制(鎖粒度)
MySQL提供兩個(gè)級(jí)別的并發(fā)控制:服務(wù)器級(jí)(the server level)和存儲(chǔ)引擎級(jí)(the storage engine level)。加鎖是實(shí)現(xiàn)并發(fā)控制的基本方法,MySQL中鎖的粒度:
表級(jí)鎖:MySQL獨(dú)立于存儲(chǔ)引擎提供表鎖,例如,對(duì)于ALTER TABLE語句,服務(wù)器提供表鎖(table-level lock)。
行級(jí)鎖:InnoDB和Falcon存儲(chǔ)引擎提供行級(jí)鎖,此外,BDB支持頁(yè)級(jí)鎖。InnoDB的并發(fā)控制機(jī)制,下節(jié)詳細(xì)討論。
另外,值得一提的是,MySQL的一些存儲(chǔ)引擎(如InnoDB、BDB)除了使用封鎖機(jī)制外,還同時(shí)結(jié)合MVCC機(jī)制,即多版本兩階段封鎖協(xié)議(Multiversion two-phrase locking protocal),來實(shí)現(xiàn)事務(wù)的并發(fā)控制,從而使得只讀事務(wù)不用等待鎖,提高了事務(wù)的并發(fā)性。
注意: 行級(jí)鎖只在存儲(chǔ)引擎層實(shí)現(xiàn),而MySQL服務(wù)器層沒有實(shí)現(xiàn)。服務(wù)器層完全不了解存儲(chǔ)引種的鎖實(shí)現(xiàn)。
3.事務(wù)
MySQL中,InnoDB和BDB都支持事務(wù)處理。這里主要討論InnoDB的事務(wù)處理。
事務(wù)的ACID特性:
事務(wù)是由一組SQL語句組成的邏輯處理單元,事務(wù)具有以下4個(gè)屬性,通常簡(jiǎn)稱為事務(wù)的ACID屬性。
原子性(Atomicity):事務(wù)是一個(gè)原子操作單元,其對(duì)數(shù)據(jù)的修改,要么全都執(zhí)行,要么全都不執(zhí)行。
一致性(Consistent):在事務(wù)開始和完成時(shí),數(shù)據(jù)都必須保持一致狀態(tài)。這意味著所有相關(guān)的數(shù)據(jù)規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持?jǐn)?shù)據(jù)的完整性;事務(wù)結(jié)束時(shí),所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如B樹索引或雙向鏈表)也都必須是正確的。
隔離性(Isolation):數(shù)據(jù)庫(kù)系統(tǒng)提供一定的隔離機(jī)制,保證事務(wù)在不受外部并發(fā)操作影響的“獨(dú)立”環(huán)境執(zhí)行。這意味著事務(wù)處理過程中的中間狀態(tài)對(duì)外部是不可見的,反之亦然。
持久性(Durable):事務(wù)完成之后,它對(duì)于數(shù)據(jù)的修改是永久性的,即使出現(xiàn)系統(tǒng)故障也能夠保持。
事務(wù)處理帶來的相關(guān)問題:
由于事務(wù)的并發(fā)執(zhí)行,帶來以下一些著名的問題:
更新丟失(Lost Update):當(dāng)兩個(gè)或多個(gè)事務(wù)選擇同一行,然后基于最初選定的值更新該行時(shí),由于每個(gè)事務(wù)都不知道其他事務(wù)的存在,就會(huì)發(fā)生丟失更新問題--最后的更新覆蓋了由其他事務(wù)所做的更新。
臟讀(Dirty Reads):一個(gè)事務(wù)正在對(duì)一條記錄做修改,在這個(gè)事務(wù)完成并提交前,這條記錄的數(shù)據(jù)就處于不一致狀態(tài);這時(shí),另一個(gè)事務(wù)也來讀取同一條記錄,如果不加控制,第二個(gè)事務(wù)讀取了這些“臟”數(shù)據(jù),并據(jù)此做進(jìn)一步的處理,就會(huì)產(chǎn)生未提交的數(shù)據(jù)依賴關(guān)系。這種現(xiàn)象被形象地叫做”臟讀”。
不可重復(fù)讀(Non-Repeatable Reads):一個(gè)事務(wù)在讀取某些數(shù)據(jù)后的某個(gè)時(shí)間,再次讀取以前讀過的數(shù)據(jù),卻發(fā)現(xiàn)其讀出的數(shù)據(jù)已經(jīng)發(fā)生了改變、或某些記錄已經(jīng)被刪除了!這種現(xiàn)象就叫做“不可重復(fù)讀”。
幻讀(Phantom Reads):一個(gè)事務(wù)按相同的查詢條件重新讀取以前檢索過的數(shù)據(jù),卻發(fā)現(xiàn)其他事務(wù)插入了滿足其查詢條件的新數(shù)據(jù),這種現(xiàn)象就稱為“幻讀”。
[MySQL的設(shè)計(jì)架構(gòu)]