溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

數(shù)據(jù)庫的相關(guān)知識(shí)梳理

發(fā)布時(shí)間:2020-04-25 11:57:59 來源:億速云 閱讀:223 作者:三月 欄目:MySQL數(shù)據(jù)庫

本文主要給大家介紹數(shù)據(jù)庫的相關(guān)知識(shí)梳理,希望可以給大家補(bǔ)充和更新些知識(shí),如有其它問題需要了解的可以持續(xù)在億速云行業(yè)資訊里面關(guān)注我的更新文章的。

硬盤

《數(shù)據(jù)庫系統(tǒng)實(shí)現(xiàn)》在第二章就單獨(dú)用一章的篇幅講解磁盤的存儲(chǔ)原理。這是因?yàn)橛?jì)算機(jī)內(nèi)置組件中具備持久存儲(chǔ)能力的只有硬盤,軟件屈從于硬件。因此理解磁盤的存儲(chǔ)特點(diǎn)才能理解軟件設(shè)計(jì)背后的邏輯。磁盤存儲(chǔ)有如下的特點(diǎn):

  1. 特性A:相比CPU的延遲,磁盤延遲非常非常大。 在《性能之巔》中有做過對(duì)比,對(duì)于3.3GHz的CPU, 一個(gè)指令周期為0.3ns;機(jī)械硬盤一次I/O的延遲為1~10ms。這個(gè)差距有多大,如果一個(gè)CPU指令周期為1s, 那么機(jī)械硬盤一次I/O的延遲為1~12個(gè)月。真是等到花兒都謝了。

  2. 特性B:磁盤是塊設(shè)備,每次寫入都是按塊來的。通常一個(gè)塊為512byte。即使用硬盤,得注意不能用輪船只運(yùn)輸一個(gè)土豆到美國。

  3. 特性C:順序IO的性能遠(yuǎn)遠(yuǎn)高于隨機(jī)IO的性能。因?yàn)轫樞騃O避免了尋道時(shí)間和旋轉(zhuǎn)延遲。

上述的特性不僅影響了數(shù)據(jù)庫的設(shè)計(jì),更是深刻影響了操作系統(tǒng)的設(shè)計(jì),例如page cache

讀寫

數(shù)據(jù)庫的操作基本上就是更高階的讀寫: select 和 delete/update 是我們使用數(shù)據(jù)庫頻率最高的操作了。 所以,數(shù)據(jù)庫解決的核心問題就是如何組織數(shù)據(jù)實(shí)現(xiàn)高性能的讀寫。

###事務(wù)
高性能沒法忽略掉并發(fā),在并發(fā)讀寫場景下,就會(huì)出現(xiàn)數(shù)據(jù)一致性的問題。所以事務(wù)就用來解決數(shù)據(jù)一致性的問題了。

默認(rèn)每條SQL語句都是一個(gè)事務(wù), 可以手動(dòng)設(shè)置提交點(diǎn)改變這一規(guī)則

MySQL中,事務(wù)的隔離級(jí)別有4種。這4種其實(shí)不用死記硬背,可以從應(yīng)用場景推導(dǎo)出來。

未提交讀

事物A修改了記錄a, 沒有提交;事務(wù)B讀取表,讀取到了該事務(wù)。 這就是未提交讀。 如果我們自己設(shè)計(jì)數(shù)據(jù)庫,在原數(shù)據(jù)上修改字段,如果沒有其他手段的控制,并發(fā)情況下就會(huì)出現(xiàn)這種情況。由于讀取到了臟數(shù)據(jù),也稱為臟讀。這里我們也可以將事務(wù)換一個(gè)熟悉的概念:線程來理解

提交讀

針對(duì)上面未提交讀的問題,如果將改動(dòng)保存在事務(wù)的作用域內(nèi)部,那么未提交的數(shù)據(jù)就不會(huì)影響其他事務(wù)。 這種隔離級(jí)別就是提交讀。也叫不可重復(fù)讀。因?yàn)槭д`內(nèi)部兩次執(zhí)行可能得到不一樣的結(jié)果。

可重復(fù)讀

提交讀面臨的不可重復(fù)讀的問題,在可重復(fù)讀隔離級(jí)別下可以避免。它能保證一個(gè)事務(wù)多次讀取同一條記錄不會(huì)改變。當(dāng)然,如果事務(wù)內(nèi)部改變了該記錄,另說。這個(gè)級(jí)別帶來的另一個(gè)問題就是[幻讀]。 這個(gè)很好理解: 2個(gè)事務(wù)。事務(wù)A 讀取記錄不存在就寫入;事務(wù)B寫入記錄。 事務(wù)A有可能出現(xiàn)寫入失敗的情況。

可序列化

將事務(wù)順序執(zhí)行。性能最低的做法。

索引

通常查詢數(shù)據(jù)有兩種典型的場景: 等值查詢區(qū)間查詢。 即select * from table where field=a 或者 select * from table where field between a and b。 如果沒有索引,唯一的做法就是全表掃描。這是一種大海撈針的做法。 程序員一般關(guān)注兩個(gè)點(diǎn): 問題在哪和怎么優(yōu)化。 對(duì)于等值查詢,最好的優(yōu)化方式就是hash了。對(duì)于區(qū)間查詢,不是hash算法的用武之地,因?yàn)樗袀€(gè)隱藏的邏輯: 排序。 通常,具備排序功能的數(shù)據(jù)結(jié)構(gòu)有: 排序后的數(shù)組,鏈表。 跳躍表。AVL樹,紅黑樹,B樹,B+樹。

為什么選擇B+樹?

  1. 硬盤是塊設(shè)備。使用B+樹,可以通過在同一個(gè)塊中容納N個(gè)元素,從而控制B樹的層級(jí)不超過3層。減小IO的次數(shù)。
  2. B+樹葉子節(jié)點(diǎn)是鏈表。方便磁盤順序IO的操作。
  3. 數(shù)據(jù)庫的相關(guān)知識(shí)梳理

性能

性能就是響應(yīng)時(shí)間。 性能問題的排查思路是top-down的方式:

  1. CPU,內(nèi)存,網(wǎng)絡(luò),IO, 硬盤是否OK?
  2. 不OK只有3種情況: 余量不足 或者 配置不合理 或者 出故障了。
  3. 索引優(yōu)化, 表結(jié)構(gòu)優(yōu)化,查詢優(yōu)化 其頭并進(jìn)。

性能問題需要更多是操作系統(tǒng)相關(guān)的知識(shí)。

復(fù)制

這個(gè)是MySQL的殺手锏。如果沒有復(fù)制功能,MySQL不可能這么流行。 復(fù)制引申出來的特性: 讀寫分離,負(fù)載均衡,高可用,故障切換, 備份, 測(cè)試升級(jí)。都是濫大街的概念。

復(fù)制的實(shí)現(xiàn)方式:基于行的復(fù)制和基于日志的復(fù)制。

可擴(kuò)展性

可擴(kuò)展性就是通過增加資源來提升系統(tǒng)容量的能力。比如MySQL通過讀寫分離,每新增一個(gè)Slave節(jié)點(diǎn),數(shù)據(jù)庫層面的讀并發(fā)能力有所提升。當(dāng)然由于系統(tǒng)分層,每個(gè)層級(jí)都支持可擴(kuò)展性,整個(gè)系統(tǒng)才具備可擴(kuò)展性。

數(shù)據(jù)庫層級(jí)的擴(kuò)展常用策略就是分庫分表這些策略了。

另外,可擴(kuò)展性跟系統(tǒng)性能是兩回事。 比如Hive性能較低,但是不影響其可擴(kuò)展性。

高可用

高可用本質(zhì)上就是更少的宕機(jī)時(shí)間。 如果從計(jì)算機(jī)的視角來看待人,人的可用性一般只有50%,按每天8小時(shí)工作制,人的可用性只有33%。

利用top-down的思路, 實(shí)現(xiàn)高可用,只有兩種辦法: 提升平均失效時(shí)間間隔, 簡而言之,就是讓系統(tǒng)兩次宕機(jī)中間的時(shí)間間隔越長越好;降低平均恢復(fù)時(shí)間, 簡而言之,就是出了故障修復(fù)時(shí)間越短越好。  所以,高可用更多的是架構(gòu)層面的東西, 比如MySQL的互為主備,負(fù)載均衡。

備份

備份是個(gè)容易被忽略的話題。屬于那種平時(shí)不待見,關(guān)鍵時(shí)刻需要扛雷。 備份的作用基本有三個(gè): 災(zāi)難恢復(fù),審計(jì),測(cè)試。

看了以上關(guān)于數(shù)據(jù)庫的相關(guān)知識(shí)梳理,希望能給大家在實(shí)際運(yùn)用中帶來一定的幫助。本文由于篇幅有限,難免會(huì)有不足和需要補(bǔ)充的地方,如有需要更加專業(yè)的解答,可在官網(wǎng)聯(lián)系我們的24小時(shí)售前售后,隨時(shí)幫您解答問題的。

 

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI