MySQL、MongoDB、列数据库的区别及应用场景
目錄
- 什么是行存儲(chǔ)和列存儲(chǔ)?
- 什么是MongoDB(NoSQL)?
- OLTP和OLAP
- 什么是CAP定理?
- 使用場(chǎng)景
- 行存儲(chǔ)的適用場(chǎng)景:
- 列存儲(chǔ)的適用場(chǎng)景:
- MongoDB相對(duì)于MySQL的優(yōu)點(diǎn)
- 更適用MySQL的場(chǎng)景
- 更適用MongoDB的場(chǎng)景
- 個(gè)人理解
- 擴(kuò)展
- 參考
什么是行存儲(chǔ)和列存儲(chǔ)?
- 行存儲(chǔ):傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,如 Oracle、DB2、MySQL、SQL SERVER 等采用行式存儲(chǔ)法(Row-based,基于行),在基于行式存儲(chǔ)的數(shù)據(jù)庫中, 數(shù)據(jù)是按照行數(shù)據(jù)為基礎(chǔ)邏輯存儲(chǔ)單元進(jìn)行存儲(chǔ)的,一行中的數(shù)據(jù)在存儲(chǔ)介質(zhì)中以連續(xù)存儲(chǔ)形式存在。
- 列存儲(chǔ)(Column-based,基于列)是相對(duì)于行存儲(chǔ)來說的,新興的 Hbase、HP Vertica、EMC Greenplum 等分布式數(shù)據(jù)庫均采用列式存儲(chǔ)。在基于列式存儲(chǔ)的數(shù)據(jù)庫中,數(shù)據(jù)是按照列為基礎(chǔ)邏輯存儲(chǔ)單元進(jìn)行存儲(chǔ)的,一列中的數(shù)據(jù)在存儲(chǔ)介質(zhì)中以連續(xù)存儲(chǔ)形式存在。
什么是MongoDB(NoSQL)?
MongoDB是面向文檔的NoSQL數(shù)據(jù)庫,用于大量數(shù)據(jù)存儲(chǔ)。
MongoDB是一個(gè)基于文檔的存儲(chǔ),在其之上還具有一個(gè)基于圖形的存儲(chǔ)。MongoDB實(shí)際上并不存儲(chǔ)JSON:它存儲(chǔ)BSON(二進(jìn)制JSON),BSON擴(kuò)展了JSON表示(字符串)以包括其他類型,例如int,long,date,浮點(diǎn),decimal128和地理空間坐標(biāo)。
OLTP和OLAP
在數(shù)據(jù)庫中,數(shù)據(jù)處理可分為兩類:聯(lián)機(jī)事務(wù)處理OLTP(on-line transaction processing) 和 聯(lián)機(jī)分析處理OLAP(On-Line Analytical Processing)
- OLTP是傳統(tǒng)關(guān)系型數(shù)據(jù)庫的主要應(yīng)用,用來執(zhí)行一些基本的、日常的事務(wù)處理,比如數(shù)據(jù)庫增、刪、改、查等等
- OLAP則是分布式數(shù)據(jù)庫的主要應(yīng)用,它對(duì)實(shí)時(shí)性要求不高,但處理的數(shù)據(jù)量大,通常應(yīng)用于復(fù)雜的動(dòng)態(tài)報(bào)表系統(tǒng)上。
什么是CAP定理?
CAP定理也稱為Brewer定理。它指出,分布式數(shù)據(jù)存儲(chǔ)不可能同時(shí)滿足CAP,只能滿足CAP其中的兩部分。
-
一致性
即在執(zhí)行操作之后,數(shù)據(jù)也應(yīng)保持一致。這意味著一旦寫入數(shù)據(jù),以后的任何讀取請(qǐng)求都應(yīng)包含該數(shù)據(jù)。例如,更新訂單狀態(tài)后,所有客戶端都應(yīng)該能夠看到相同的數(shù)據(jù)。
-
可用性
該數(shù)據(jù)庫應(yīng)始終可用且響應(yīng)迅速。它不應(yīng)有任何宕機(jī)時(shí)間。
-
分區(qū)容錯(cuò)性
分區(qū)容限意味著即使服務(wù)器之間的通信不穩(wěn)定,系統(tǒng)也應(yīng)繼續(xù)運(yùn)行。例如,可以將服務(wù)器劃分為可能無法相互通信的多個(gè)組。在此,如果數(shù)據(jù)庫的一部分不可用,則其他部分始終不受影響。
使用場(chǎng)景
行存儲(chǔ)的適用場(chǎng)景:
- 適合隨機(jī)的增、刪、改、查操作;
- 需要在行中選取所有屬性的查詢操作;
- 需要頻繁插入或更新的操作,其操作與索引和行的大小更為相關(guān)。
列存儲(chǔ)的適用場(chǎng)景:
- 查詢過程中,可針對(duì)各列的運(yùn)算并發(fā)執(zhí)行,在內(nèi)存中聚合完整記錄集,降低查詢響應(yīng)時(shí)間;
- 在數(shù)據(jù)中高效查找數(shù)據(jù),無需維護(hù)索引(任何列都能作為索引),查詢過程中能夠盡量減少無關(guān)IO,避免全表掃描;
- 因?yàn)楦髁歇?dú)立存儲(chǔ),且數(shù)據(jù)類型已知,可以針對(duì)該列的數(shù)據(jù)類型、數(shù)據(jù)量大小等因素動(dòng)態(tài)選擇壓縮算法,以提高物理存儲(chǔ)利用率;如果某一行的某一列沒有數(shù)據(jù),在列存儲(chǔ)時(shí),就可以不存儲(chǔ)該列的值,這將比行式存儲(chǔ)更節(jié)省空間。
實(shí)際應(yīng)用中我們會(huì)發(fā)現(xiàn),行式數(shù)據(jù)庫在讀取數(shù)據(jù)時(shí)存在一個(gè)固有的缺陷,比如,所選擇查詢的目標(biāo)即是只涉及少數(shù)幾個(gè)字段,但由于這些目標(biāo)數(shù)據(jù)埋藏在各行數(shù)據(jù)單元中,而行單元往往又特別大,應(yīng)用程序必須讀取每一條完整的行記錄,從而使得讀取效率大大較低,對(duì)此,行式數(shù)據(jù)庫給出的優(yōu)化方案是加索引,在OLTP類型的應(yīng)用中,通過索引機(jī)制或給表分區(qū)等手段可以簡化查詢操作步驟,并提升查詢效率。
針對(duì)海量數(shù)據(jù)背景的OLAP應(yīng)用(例如分布式數(shù)據(jù)庫、數(shù)據(jù)倉庫等),行存儲(chǔ)的數(shù)據(jù)庫就有些力不從心了,行式數(shù)據(jù)庫建立索引和物化視圖需要花費(fèi)大量時(shí)間和資源,因此還是不劃算的,無法從根本上解決查詢性能和維護(hù)成本的問題,也不適用于數(shù)據(jù)倉庫等應(yīng)用場(chǎng)景,所以后來出現(xiàn)了基于列式存儲(chǔ)的數(shù)據(jù)庫。
對(duì)于數(shù)據(jù)倉庫和分布式數(shù)據(jù)庫來說,大部分情況下它會(huì)從各個(gè)數(shù)據(jù)源匯總數(shù)據(jù),然后進(jìn)行分析和反饋,其大多數(shù)操作是圍繞同一個(gè)字段(屬性)進(jìn)行的,而當(dāng)查詢某屬性的數(shù)據(jù)記錄時(shí),列式數(shù)據(jù)庫只需返回與列屬性相關(guān)的值。在大數(shù)據(jù)量查詢場(chǎng)景中,列式數(shù)據(jù)庫可在內(nèi)存中高效組裝各列的值,最終形成關(guān)系記錄集,因此可以顯著減少IO消耗并降低查詢響應(yīng)時(shí)間,非常適合數(shù)據(jù)倉庫和分布式的應(yīng)用。
MongoDB相對(duì)于MySQL的優(yōu)點(diǎn)
- MongoDB文檔自然映射到現(xiàn)代的面向?qū)ο缶幊陶Z言。使用MongoDB可以避免將代碼中的對(duì)象轉(zhuǎn)換為關(guān)系表的復(fù)雜對(duì)象關(guān)系映射(ORM)層
- MongoDB的靈活數(shù)據(jù)模型也意味著您的數(shù)據(jù)庫模式可以隨業(yè)務(wù)需求而發(fā)展。例如,在天氣頻道的MySQL數(shù)據(jù)庫中花費(fèi)數(shù)周時(shí)間的模式更改可能會(huì)在短短幾個(gè)小時(shí)內(nèi)由MongoDB完成。
- MongoDB還可以在多個(gè)分布式數(shù)據(jù)中心之間進(jìn)行擴(kuò)展,提供以前MySQL等關(guān)系數(shù)據(jù)庫無法實(shí)現(xiàn)的新的可用性和可擴(kuò)展性。隨著在數(shù)據(jù)量和吞吐量方面的增長,MongoDB可輕松擴(kuò)展,無需停機(jī),無需更改應(yīng)用程序。
更適用MySQL的場(chǎng)景
需要復(fù)雜的多行事務(wù)的應(yīng)用程序
一個(gè)具體的例子是旅行預(yù)訂系統(tǒng)背后的預(yù)訂引擎,通常還涉及復(fù)雜的事務(wù)。雖然核心預(yù)訂引擎可能在MySQL上運(yùn)行,但是與用戶互動(dòng)的應(yīng)用程序部分 – 提供內(nèi)容,與社交網(wǎng)絡(luò)集成,管理會(huì)話 – 將更好地放在MongoDB中
許多電子商務(wù)應(yīng)用程序使用MongoDB和MySQL的組合。產(chǎn)品目錄包括具有不同屬性的多個(gè)產(chǎn)品,非常適合MongoDB的靈活數(shù)據(jù)模型。另一方面,需要復(fù)雜事務(wù)的結(jié)帳系統(tǒng)可能建立在MySQL或其他關(guān)系數(shù)據(jù)庫技術(shù)上。
更適用MongoDB的場(chǎng)景
更高的寫入負(fù)載
默認(rèn)情況下,MongoDB更側(cè)重高數(shù)據(jù)寫入性能,而非事務(wù)安全,MongoDB很適合業(yè)務(wù)系統(tǒng)中有大量“低價(jià)值”數(shù)據(jù)的場(chǎng)景。但是應(yīng)當(dāng)避免在高事務(wù)安全性的系統(tǒng)中使用MongoDB,除非能從架構(gòu)設(shè)計(jì)上保證事務(wù)安全。
高可用性
MongoDB的復(fù)副集(Master-Slave)配置非常簡潔方便,此外,MongoDB可以快速響應(yīng)的處理單節(jié)點(diǎn)故障,自動(dòng)、安全的完成故障轉(zhuǎn)移。這些特性使得MongoDB能在一個(gè)相對(duì)不穩(wěn)定(如云主機(jī))的環(huán)境中,保持高可用性。
數(shù)據(jù)量很大或者未來會(huì)變得很大
依賴數(shù)據(jù)庫(MySQL)自身的特性,完成數(shù)據(jù)的擴(kuò)展是較困難的事,在MySQL中,當(dāng)一個(gè)單達(dá)表到5-10GB時(shí)會(huì)出現(xiàn)明顯的性能降級(jí),此時(shí)需要通過數(shù)據(jù)的水平和垂直拆分、庫的拆分完成擴(kuò)展,使用MySQL通常需要借助驅(qū)動(dòng)層或代理層完成這類需求。而MongoDB內(nèi)建了多種數(shù)據(jù)分片的特性,可以很好的適應(yīng)大數(shù)據(jù)量的需求。
基于位置的數(shù)據(jù)查詢
MongoDB支持二維空間索引,因此可以快速及精確的從指定位置獲取數(shù)據(jù)。
表結(jié)構(gòu)不明確,且數(shù)據(jù)在不斷變大
在一些傳統(tǒng)RDBMS中,增加一個(gè)字段會(huì)鎖住整個(gè)數(shù)據(jù)庫/表,或者在執(zhí)行一個(gè)重負(fù)載的請(qǐng)求時(shí)會(huì)明顯造成其它請(qǐng)求的性能降級(jí)。通常發(fā)生在數(shù)據(jù)表大于1G的時(shí)候(當(dāng)大于1TB時(shí)更甚)。 因MongoDB是文檔型數(shù)據(jù)庫,為非結(jié)構(gòu)貨的文檔增加一個(gè)新字段是很快速的操作,并且不會(huì)影響到已有數(shù)據(jù)另外一個(gè)好處當(dāng)業(yè)務(wù)數(shù)據(jù)發(fā)生變化時(shí),是將不在需要由DBA修改表結(jié)構(gòu)。
沒有DBA(數(shù)據(jù)庫管理員)支持
如果沒有專職的DBA,并且準(zhǔn)備不使用標(biāo)準(zhǔn)的關(guān)系型思想(結(jié)構(gòu)化、連接等)來處理數(shù)據(jù),那么MongoDB將會(huì)是你的首選。MongoDB對(duì)于對(duì)像數(shù)據(jù)的存儲(chǔ)非常方便,類可以直接序列化成JSON存儲(chǔ)到MongoDB中。 但是需要先了解一些最佳實(shí)踐,避免當(dāng)數(shù)據(jù)變大后,由于文檔設(shè)計(jì)問題而造成的性能缺陷。
個(gè)人理解
擴(kuò)展
- 垂直擴(kuò)展:提升單機(jī)處理能力。
- 水平擴(kuò)展:只要增加服務(wù)器數(shù)量,就能線性擴(kuò)充系統(tǒng)性能。
參考
- 基于行存儲(chǔ)和列存儲(chǔ)的數(shù)據(jù)庫
- MongoDB和MySQL對(duì)比(譯)
- NoSQL教程:了解NoSQL的功能,類型,含義,優(yōu)勢(shì)
- 對(duì)比mysql,什么場(chǎng)景更適用Mongodb
總結(jié)
以上是生活随笔為你收集整理的MySQL、MongoDB、列数据库的区别及应用场景的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑一直recovering(电脑一直循
- 下一篇: MySQL优化(一):表结构优化