1 關(guān)系型數(shù)據(jù)庫
1.1 關(guān)系型數(shù)據(jù)庫的特性
1.1.1 事務(wù)的特性
事務(wù),是指一個(gè)操作序列,這些操作要么都執(zhí)行,或者都不執(zhí)行,而且這一序列是無法分隔的獨(dú)立操作單位。也就是符合原子性(Atomicity)、 一致性(Consistency)、 隔離性(Isolation)和持久性(Durability)的一組操作。
- 原子性:指一個(gè)事務(wù)中的所有操作全部提交成功,或者全部失敗。不存在中間過程。
- 一致性:指的是在一個(gè)事務(wù)執(zhí)行前后中,讀取的數(shù)據(jù)都是一致相同的。
- 隔離性:指一個(gè)事務(wù)與另外的事物操作過程中的相互隔離的,其他事務(wù)無法查看其中間過程。
- 持久性:指一個(gè)事務(wù)一旦提交,哪怕是系統(tǒng)故障,所做的修改將會(huì)永遠(yuǎn)保存在數(shù)據(jù)庫中。
其中一致性是事務(wù)實(shí)現(xiàn)的目標(biāo),其他特性相當(dāng)于是為了保證事務(wù)一致性的手段,比如原子性是保證事務(wù)執(zhí)行操作不存在中間過程,無法分隔,保證事務(wù)的一致性;隔離性指在并發(fā)時(shí)防止事務(wù)之間相互干預(yù)影響,確保最后事務(wù)執(zhí)行前后的一致性;持久性是哪怕系統(tǒng)崩潰出現(xiàn)故障時(shí),數(shù)據(jù)修改也永遠(yuǎn)保存在數(shù)據(jù)庫中,也確保了事務(wù)執(zhí)行前后的一致性。
1.1.2 事務(wù)的隔離
上面說到事務(wù)的隔離性,就是為了防止在并發(fā)時(shí)事務(wù)之間相互影響,那么如果沒有事務(wù)之間的隔離,會(huì)發(fā)生哪些現(xiàn)象呢?
- 丟失更新
一個(gè)事務(wù)的撤銷操作覆蓋了另一個(gè)事務(wù)已提交的更新數(shù)據(jù),比如有兩個(gè)事務(wù)對(duì)統(tǒng)一賬戶進(jìn)行操作,如下圖所示:
在T3時(shí)刻兩個(gè)事務(wù)都完成了取走200的操作,在T4時(shí)刻事務(wù)A提交余額,但是在T5時(shí)刻事務(wù)B撤銷事務(wù),如果沒有隔離,那么會(huì)發(fā)生賬戶金額不變,卻取走200的事情發(fā)生。
- 臟讀
臟讀指的是一個(gè)事務(wù)讀取到另一個(gè)事務(wù)未提交的數(shù)據(jù),如下圖所示:
在T3時(shí)刻事務(wù)A取走200,但是在事務(wù)A提交撤銷前,事務(wù)B在T4時(shí)刻對(duì)賬戶進(jìn)行查詢操作會(huì)讀取到錯(cuò)誤的信息。比如某人從賬戶中取出200,沒有提交不想取了,提交撤銷命令,如果這個(gè)時(shí)候在提交前有另一事務(wù)對(duì)該賬戶進(jìn)行查詢,會(huì)發(fā)現(xiàn)賬戶沒取到錢卻少200。
- 幻讀(虛讀)
虛讀其實(shí)也是一種不可重復(fù)讀的現(xiàn)象,是指一個(gè)事務(wù)讀到了另一個(gè)事務(wù)已經(jīng)提交的新增數(shù)據(jù),重點(diǎn)是新增或者刪除,讀取前后數(shù)據(jù)量不一致。如圖:
比如事務(wù)A在新增數(shù)據(jù)后提交,在T2、T5時(shí)刻事務(wù)B的兩次查詢就會(huì)不一樣,好像發(fā)生了幻覺一樣。這就是幻讀,發(fā)生了不存在的事情
- 不可重復(fù)讀
一個(gè)事務(wù)讀取到了另一個(gè)事務(wù)已經(jīng)提交的更新數(shù)據(jù),重點(diǎn)是修改,讀取前后數(shù)據(jù)量一致,內(nèi)容不一致。如圖:
事務(wù)B在兩次查詢中發(fā)現(xiàn)數(shù)據(jù)庫結(jié)果不一樣
幻讀和不可重復(fù)讀的區(qū)別?
幻讀重點(diǎn)是操作的新增或刪除,不可重復(fù)讀的重點(diǎn)是操作的修改。在讀取上兩者類似
但是在隔離控制上,針對(duì)于兩種情況,對(duì)于不可重復(fù)讀,只需要鎖住滿足條件的記錄(如出現(xiàn)內(nèi)部不一致的哪一行數(shù)據(jù)即可);對(duì)于幻讀,因?yàn)槌霈F(xiàn)了數(shù)據(jù)量不一致,不僅需要所著滿足條件的記錄,甚至于要鎖住相近的記錄或者(多行數(shù)據(jù)或者整個(gè)表)
1.1.3 隔離級(jí)別
- 1.讀未提交(Read Uncommited)
一個(gè)事務(wù)可以讀到另一個(gè)事務(wù)未提交的數(shù)據(jù)
- 2.讀已提交(Read Commited )
一個(gè)事務(wù)可以讀到另一個(gè)事務(wù)提交到的數(shù)據(jù)
- 3.可重復(fù)讀(Repeatable Read)
一個(gè)事務(wù)中相同的查詢會(huì)看到同樣的數(shù)據(jù)行,也就是事務(wù)在執(zhí)行期間看到的數(shù)據(jù)前后必須是一致的。是MySQL默認(rèn)的隔離級(jí)別
- 4.串行化(Serializable)
事務(wù)之間以一種串行的方式執(zhí)行,安全性非常高
隔離級(jí)別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
---|---|---|---|
讀未提交 | 否 | 否 | 否 |
讀已提交 | 是 | 否 | 否 |
可重復(fù)讀 | 是 | 是 | 否 |
串行化 | 是 | 是 | 是 |
1.1.4 范式
關(guān)系型數(shù)據(jù)庫一般遵循三范式設(shè)計(jì)思想
- 第一范式
要求對(duì)屬性的原子性,也就是數(shù)據(jù)庫中的字段要具備原子性,不能再被拆分。
- 第二范式
在滿足第一范式的前提下,要保證數(shù)據(jù)表中的實(shí)例或行必須可以被唯一區(qū)分。
- 第三范式
在滿足第一、二范式的前提下,保證數(shù)據(jù)表中的所有非主鍵字段必須直接依賴主鍵,每個(gè)表中不包含其他表中已經(jīng)包含的非主鍵關(guān)鍵字段的信息。
1.2 MySQL索引
數(shù)據(jù)庫索引是數(shù)據(jù)庫管理系統(tǒng)中的一個(gè)排序的數(shù)據(jù)結(jié)構(gòu),用于協(xié)助快速查詢、更新數(shù)據(jù)庫表中的數(shù)據(jù)。通常使用B樹或B+樹來實(shí)現(xiàn)
1.2.1 B+ 樹索引
是大多數(shù)MySQL存儲(chǔ)引擎的默認(rèn)索引類型,而且因?yàn)锽+樹的有序性,除了用于查找,還可以用于排序和分組,同時(shí)可以指定多個(gè)列作為索引列,多個(gè)索引列共同組成鍵。
InnoDB 的 B+ 樹索引分為主索引和輔助索引。主索引的葉子節(jié)點(diǎn)data 域記錄著完整的數(shù)據(jù)記錄,一個(gè)表只能有一個(gè)聚簇索引。輔助索引的葉子節(jié)點(diǎn)的data域記錄著主鍵的值,在使用輔助索引進(jìn)行查找時(shí),需要先查到主鍵值,然后再到主索引中進(jìn)行查找。
1.2.2 哈希索引
能以O(shè)(1)時(shí)間進(jìn)行查找,但是失去了有序性,只能支持精確查找,無法用于排序和分組
1.2.3 全文索引
MyISAM 存儲(chǔ)索引支持全文索引,用于查找文本中的關(guān)鍵詞,不是直接比較是否相等
1.2.4 空間數(shù)據(jù)索引
MyISAM存儲(chǔ)引擎支持空間數(shù)據(jù)索引,可以用于地理數(shù)據(jù)存儲(chǔ)。空間數(shù)據(jù)索引會(huì)從所有維度來索引數(shù)據(jù),可以有效地使用任意維度來進(jìn)行組合查詢
MySQL 的優(yōu)化方案有哪些?
(1)SQL和索引優(yōu)化
- 適當(dāng)使用前綴索引,減少索引長度他,提高查詢效率
- 查詢具體字段非全部字段
- 優(yōu)化子查詢
- 盡量使用小表驅(qū)動(dòng)大表的方式查詢
- 不要再列字段上進(jìn)行運(yùn)算操作
- 適當(dāng)增加冗余字段,以減少多張表的關(guān)聯(lián)查詢,以空間換時(shí)間的優(yōu)化策略
(2)數(shù)據(jù)庫結(jié)構(gòu)優(yōu)化
- 最小數(shù)據(jù)長度,如將表的字段設(shè)置的盡可能小,提高表的效率
- 使用最簡單的數(shù)據(jù)類型,比如int就要比varchar查詢效率快
- 盡量少定義text類型
- 適當(dāng)分表(當(dāng)一張表中的字段更多時(shí),可以嘗試將大表拆分成多張子表,高頻的主信息放入主表中,其他放入子表),分庫(將一個(gè)數(shù)據(jù)庫拆分成多個(gè)數(shù)據(jù)庫,主數(shù)據(jù)庫用于寫入和修改數(shù)據(jù),其他的用于同步主數(shù)據(jù)并提供給客戶端查詢)
(3)硬件優(yōu)化
- 硬盤,使用高性能的磁盤
- 網(wǎng)絡(luò),保證網(wǎng)絡(luò)帶寬
- 內(nèi)存,提高 MySQL 服務(wù)器的內(nèi)存
1.3 MySQL存儲(chǔ)引擎
在選擇數(shù)據(jù)庫引擎時(shí)要從實(shí)際業(yè)務(wù)出發(fā),比如是否需要支持事務(wù)、外鍵、持久化等等。
1.3.1 InnoDB
InnoDB 是MySQL 5.5.5后的默認(rèn)數(shù)據(jù)引擎,優(yōu)點(diǎn)是支持事務(wù)和四種隔離級(jí)別,此外還支持外鍵、崩潰后的快速回復(fù)、支持全文檢索、集群索引以及地理位置類型的存儲(chǔ)和索引等功能。在MySQL8.0前重啟服務(wù)InnoDB自增索引會(huì)丟失,無法自增。MyISAM引擎可以自增ID
1.3.2 MyISAM
它是 MyISAM 原生引擎,不支持事務(wù)功能,有獨(dú)立的索引文件,對(duì)比InnoDB不支持外鍵
2.非關(guān)系型數(shù)據(jù)庫(NoSQL)
非關(guān)系型數(shù)據(jù)庫(NoSQL)不同于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,通常用于超大規(guī)模數(shù)據(jù)的存儲(chǔ),因?yàn)檫@些數(shù)據(jù)存儲(chǔ)不需要固定的模式,無需多余操作就可以橫向擴(kuò)展。
2.1 NoSQL的相關(guān)特性
2.1.1 CAP定理
在計(jì)算機(jī)科學(xué)中, CAP定理(CAP theorem), 又被稱作 布魯爾定理(Brewer’s theorem), 它指出對(duì)于一個(gè)分布式計(jì)算系統(tǒng)來說,不可能同時(shí)滿足以下三點(diǎn):
- 一致性(Consistency) (所有節(jié)點(diǎn)在同一時(shí)間具有相同的數(shù)據(jù))
- 可用性(Availability) (保證每個(gè)請(qǐng)求不管成功或者失敗都有響應(yīng))
- 分隔容忍(Partition tolerance) (系統(tǒng)中任意信息的丟失或失敗不會(huì)影響系統(tǒng)的繼續(xù)運(yùn)作)
CAP理論的核心是:一個(gè)分布式系統(tǒng)不可能同時(shí)很好的滿足一致性,可用性和分區(qū)容錯(cuò)性這三個(gè)需求,最多只能同時(shí)較好的滿足兩個(gè)。
因此,根據(jù) CAP 原理將 NoSQL 數(shù)據(jù)庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三 大類:
- CA - 單點(diǎn)集群,滿足一致性,可用性的系統(tǒng),通常在可擴(kuò)展性上不太強(qiáng)大。
- CP - 滿足一致性,分區(qū)容忍性的系統(tǒng),通常性能不是特別高。
- AP - 滿足可用性,分區(qū)容忍性的系統(tǒng),通??赡軐?duì)一致性要求低一些。
2.1.2 BASE特性
BASE:Basically Available, Soft-state, Eventually Consistent。 由 Eric Brewer 定義。
CAP理論的核心是:一個(gè)分布式系統(tǒng)不可能同時(shí)很好的滿足一致性,可用性和分區(qū)容錯(cuò)性這三個(gè)需求,最多只能同時(shí)較好的滿足兩個(gè)。
BASE是NoSQL數(shù)據(jù)庫通常對(duì)可用性及一致性的弱要求原則:
- Basically Available --基本可用
- Soft-state --軟狀態(tài)/柔性事務(wù)。 “Soft state” 可以理解為"無連接"的, 而 “Hard state” 是"面向連接"的
- Eventually Consistency – 最終一致性, 也是 ACID 的最終目的。
ACID vs BASE
ACID | BASE |
---|---|
原子性(Atomicity) | 基本可用(Basically Available) |
一致性(Consistency) | 軟狀態(tài)/柔性事務(wù)(Soft state) |
隔離性(Isolation) | 最終一致性 (Eventual consistency) |
持久性 (Durable) |
2.2 NoSQL 數(shù)據(jù)庫分類
類型 | 部分代表 | 特點(diǎn) |
---|---|---|
列存儲(chǔ) | Hbase Cassandra Hypertable |
顧名思義,是按列存儲(chǔ)數(shù)據(jù)的。最大的特點(diǎn)是方便存儲(chǔ)結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù),方便做數(shù)據(jù)壓縮,對(duì)針對(duì)某一列或者某幾列的查詢有非常大的IO優(yōu)勢(shì)。 |
文檔存儲(chǔ) | MongoDB CouchDB |
文檔存儲(chǔ)一般用類似json的格式存儲(chǔ),存儲(chǔ)的內(nèi)容是文檔型的。這樣也就有機(jī)會(huì)對(duì)某些字段建立索引,實(shí)現(xiàn)關(guān)系數(shù)據(jù)庫的某些功能。 |
key-value存儲(chǔ) | Tokyo Cabinet / TyrantBerkeley DB MemcacheDB Redis |
可以通過key快速查詢到其value。一般來說,存儲(chǔ)不管value的格式,照單全收。(Redis包含了其他功能) |
圖存儲(chǔ) | Neo4J FlockDB |
圖形關(guān)系的最佳存儲(chǔ)。使用傳統(tǒng)關(guān)系數(shù)據(jù)庫來解決的話性能低下,而且設(shè)計(jì)使用不方便。 |
對(duì)象存儲(chǔ) | db4o Versant |
通過類似面向?qū)ο笳Z言的語法操作數(shù)據(jù)庫,通過對(duì)象的方式存取數(shù)據(jù)。 |
xml數(shù)據(jù)庫 | Berkeley DB XML BaseX |
高效的存儲(chǔ)XML數(shù)據(jù),并支持XML的內(nèi)部查詢語法,比如XQuery,Xpath。 |
全文搜索數(shù)據(jù)庫 | ElasticSearch solr |
它們的出現(xiàn)解決了關(guān)系型數(shù)據(jù)庫全文搜索功能較弱的問題 |
2.2.1 文檔型數(shù)據(jù)庫
文檔型數(shù)據(jù)庫通常以 JSON 或者 XML 為格式進(jìn)行數(shù)據(jù)存儲(chǔ),主要以 MongoDB 和 Apache CouchDB 為代表。適用于敏捷開發(fā)、日志系統(tǒng)和社交系統(tǒng)等
MongoDB
MongoDB 是由 C++ 語言編寫的基于分布式文件存儲(chǔ)的開源數(shù)據(jù)庫系統(tǒng)。在高負(fù)載的情況下,能添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key => value)對(duì)組成。MongDB 文檔類似于 JSON 對(duì)象。字段值可以包含其他文檔,數(shù)據(jù)以及文檔數(shù)組。其結(jié)構(gòu)類似如下:
{
id: 123,
name: "wang",
sex: "male",
group: [ "news", "sports" ]
}
MongoDB 是以 JSON 格式存儲(chǔ)數(shù)據(jù),它對(duì) JSON 做了一些優(yōu)化能支持更多的數(shù)據(jù)類型,稱為 BSON 。BSON 具有三個(gè)特點(diǎn): 輕量、可遍歷以及高效, 他的缺點(diǎn)是空間利用率不是很高。但是它擁有比關(guān)系型數(shù)據(jù)庫更快的開發(fā)速度。
MongoDB 在 4.0 前是不支持事務(wù),在 4.2 中實(shí)現(xiàn)了分布式事務(wù)的功能。
2.2.2 全文搜索型數(shù)據(jù)庫
傳統(tǒng)的關(guān)系型數(shù)據(jù)庫主要依賴索引來實(shí)現(xiàn)快速查詢功能,但是在全文搜索的業(yè)務(wù)下,索引很難滿足查詢的需求。關(guān)系型數(shù)據(jù)庫的模糊匹配在數(shù)據(jù)量較大的情況下查詢的效率是很低的。需要?jiǎng)?chuàng)建大量的索引,因此也需要專門的全文搜索引擎及相關(guān)的數(shù)據(jù)庫來實(shí)現(xiàn)
2.2.3 鍵值型數(shù)據(jù)庫
鍵值型數(shù)據(jù)庫通常被當(dāng)作非持久化的內(nèi)存型數(shù)據(jù)庫緩存來使用,典型代表數(shù)據(jù)庫是 Redis 和 Memcached 。此類數(shù)據(jù)的優(yōu)點(diǎn)是性能比較高,但是對(duì)事務(wù)的支持不是很好。
Redis 介紹
見
參考博文:
MySQL事務(wù)還能這么理解?這回我知道怎么應(yīng)付面試官了
CS-Notes文章來源:http://www.zghlxwxcb.cn/news/detail-783685.html
RUNOOB文章來源地址http://www.zghlxwxcb.cn/news/detail-783685.html
到了這里,關(guān)于重學(xué)MySQL之關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!