MySQL入門-數(shù)據(jù)庫基本概念

鼓起勇氣開了這個目錄,通過MySQL梳理下數(shù)據(jù)庫系統(tǒng)的基本概念和知識,希望能夠堅持下來~

什么是數(shù)據(jù)庫?

什么是數(shù)據(jù)庫?數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)、數(shù)據(jù)庫系統(tǒng)有什么區(qū)別?按照定義,數(shù)據(jù)庫是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的倉庫;數(shù)據(jù)庫管理系統(tǒng)是操作和管理數(shù)據(jù)庫的系統(tǒng);而數(shù)據(jù)庫系統(tǒng)是包括了數(shù)據(jù)庫、各種軟硬件以及相關(guān)管理人員的綜合系統(tǒng)。從概念上來講數(shù)據(jù)庫系統(tǒng)大于管理系統(tǒng)大于數(shù)據(jù)庫,然而在實際的使用當(dāng)中,三者之間的概念經(jīng)常比較模糊,所以后面筆者都統(tǒng)一稱之為數(shù)據(jù)庫系統(tǒng)。

現(xiàn)代數(shù)據(jù)庫系統(tǒng)主要由兩部分組成:數(shù)據(jù)庫服務(wù)器和數(shù)據(jù)庫內(nèi)核,其中數(shù)據(jù)庫服務(wù)器又包括了兩個大的部分:連接控制部分和查詢處理部分。總的來講,數(shù)據(jù)庫系統(tǒng)是一個非常清晰的三層結(jié)構(gòu),其整體結(jié)構(gòu)如下圖所示。

數(shù)據(jù)庫三層架構(gòu)(from 高性能MySQL)

第一層:和客戶端連接的交互層,這部分和一般的C/S系統(tǒng)都很類似,主要負責(zé)連接處理、用戶授權(quán)、安全控制等;

第二層:核心功能層,這部分包括了查詢解析、分析、優(yōu)化、緩存、計算等等,所有跨引擎的功能都在這一層實現(xiàn),例如:存儲過程、觸發(fā)器等;

第三層:存儲引擎,負責(zé)真實數(shù)據(jù)的存儲和讀取,向上提供基本的API供數(shù)據(jù)庫服務(wù)器進行調(diào)用,我們常說的innodb、tokudb包括最近比較火的rocksdb其實都是存儲引擎層,不同的存儲引擎向上提供相同的API。

重要概念

在深入了解數(shù)據(jù)庫系統(tǒng)之前,先了解一下數(shù)據(jù)庫中經(jīng)常聽到的幾個基本的概念:鎖、并發(fā)控制、事務(wù)、隔離級別。

鎖與并發(fā)控制

鎖和并發(fā)控制并不是數(shù)據(jù)庫系統(tǒng)中特有的概念,對于任何有并發(fā)訪問的系統(tǒng)都或多或少的會使用鎖進行并發(fā)訪問的控制。對于鎖,經(jīng)常聽到的有樂觀鎖、悲觀鎖、共享鎖、排它鎖、讀鎖、寫鎖、表鎖、行鎖等等,這些鎖到底代表了什么?他們之間又有什么區(qū)別?

樂觀鎖vs悲觀鎖

樂觀鎖和悲觀鎖其實更多的是思想層面的東西。對于樂觀鎖,其基本思想就是對于同一份數(shù)據(jù),總是假設(shè)不會有別的進程對其進行修改,所以不需要對數(shù)據(jù)進行加鎖;而悲觀鎖則是相反,它總是假設(shè)別的進程會對當(dāng)前數(shù)據(jù)進行修改,所以需要對數(shù)據(jù)進行加鎖。

共享鎖vs排它鎖

共享鎖和排它鎖討論的是加鎖方式。讀鎖和寫鎖只不過是另一種稱呼而已,本質(zhì)上完全相同。對于共享鎖(讀鎖),如果一個進程對數(shù)據(jù)加上了共享鎖,那么其他進程依然能夠?qū)υ摂?shù)據(jù)加共享鎖,同一個數(shù)據(jù)被多個進程共享。對于排它鎖(寫鎖),如果一個進程對數(shù)據(jù)加上了排它鎖,那么其他進程不能在對該數(shù)據(jù)加鎖。

表鎖vs行鎖

表鎖和行鎖指的是具體的加鎖粒度。對于數(shù)據(jù)庫而言,表鎖表示對整張表進行加鎖,而行鎖則是對具體的行進行加鎖。介于表鎖和行鎖之間的還有一種鎖叫做頁鎖,頁鎖是對一個數(shù)據(jù)頁進行加鎖。通常來說,鎖的粒度越小越并發(fā)控制越好,但是加鎖的成本也會更高。

事務(wù)

數(shù)據(jù)庫系統(tǒng)與文件系統(tǒng)相比,一個非常重要的特點就是數(shù)據(jù)庫系統(tǒng)支持事務(wù)。提到事務(wù),自然免不了事務(wù)的四大屬性:

原子性(Atomicity)。事務(wù)作為數(shù)據(jù)庫系統(tǒng)恢復(fù)和并發(fā)控制的基本單位,事務(wù)中的一組操作要么全部執(zhí)行要么全部不執(zhí)行;

一致性(Consistency)。所有的數(shù)據(jù)必須從一個一致性的狀態(tài)變?yōu)榱硪粋€一致性的狀態(tài),一致性與原子性緊密關(guān)聯(lián);

隔離性(Isolation)。事務(wù)內(nèi)的所有操作都不能影響其它事務(wù),即不同事務(wù)之間的操作需要相互隔離;

持久性(Durability)。事務(wù)一旦提交,其對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,其它操作或者故障都不應(yīng)該對此造成影響。

上述概念看起來并不復(fù)雜,大部分接觸過數(shù)據(jù)庫的人都能說出ACID,但是真正理解其本質(zhì)還需要對數(shù)據(jù)庫系統(tǒng)進行深入的了解。

隔離級別

與事務(wù)直接相關(guān)的另一個概念就是事務(wù)的隔離級別,數(shù)據(jù)庫系統(tǒng)中的隔離級別分為四個等級:

未提交讀(Read Uncommitted)。一個事務(wù)A對某個數(shù)據(jù)進行修改,此時事務(wù)A還未提交,但是另外一個事務(wù)B已經(jīng)能夠看到事務(wù)A對于該數(shù)據(jù)的修改。此種隔離級別未對不同事務(wù)的操作進行任何隔離。此種事務(wù)隔離級別會出現(xiàn)臟讀。

已提交讀(Read Committed)。一個事務(wù)A對某個數(shù)據(jù)進行修改,此時事務(wù)A還未提交,事務(wù)B此時無法讀取到事務(wù)A修改的數(shù)據(jù)(讀到舊值),事務(wù)A提交后事務(wù)B才能看到對應(yīng)的修改(讀到新值)。此種隔離解決了臟讀的問題,但是造成了另外一個問題:事務(wù)B前后讀到的數(shù)據(jù)不一致,這種情況也被稱為不可重復(fù)讀。

可重復(fù)讀(Repeated Read)??芍貜?fù)讀解決了已提交讀中的前后讀取到的相同數(shù)據(jù)項值不一致的問題,但是仍然無法解決一個問題:事務(wù)B先按照某個條件讀取了一批數(shù)據(jù),此時事務(wù)A插入了一批新的數(shù)據(jù)并提交,事務(wù)B再次按照相同的條件查詢時可能會讀到新的數(shù)據(jù),這種情況被稱為幻讀。

串行化讀(Serializable)。串行化讀是事務(wù)間最高的隔離級別,不同事務(wù)完全按照串行化的方式執(zhí)行,但是也極大的影響了數(shù)據(jù)庫的并發(fā)能力。

MySQL(with innodb)默認(rèn)的事務(wù)隔離級別是可重復(fù)讀,并且解決了幻讀的問題,其基本的實現(xiàn)方式就是通過多版本并發(fā)控制(MVCC),關(guān)于多版本并發(fā)控制,后面將會單獨進行介紹。

以上對數(shù)據(jù)庫系統(tǒng)做了一個基本的介紹,后續(xù)將對數(shù)據(jù)庫的各個細節(jié)部分分別介紹,文中有問題的地方歡迎大家拍磚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容