MongoDB與MySQL,該如何從中選用數(shù)據(jù)庫(kù)?
譯文【51CTO.com快譯】不可否認(rèn),MongoDB和MySQL都是性能極其卓越的數(shù)據(jù)庫(kù)。但是,它們?cè)诓煌I(lǐng)域卻各有所長(zhǎng)。本文將和您一起討論兩者的各自特征、區(qū)別、以及在不同環(huán)境下的各種優(yōu)缺點(diǎn),以方便您在實(shí)踐應(yīng)用中做出明智的選擇。
什么是MySQL?
自1995年被投入市場(chǎng)以來(lái),MySQL以其易用性和可靠性,在業(yè)界享有不菲的聲譽(yù)。開(kāi)源的MySQL屬于關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)。更具體地說(shuō),RDBMS是用于更新、管理和規(guī)劃關(guān)系型數(shù)據(jù)庫(kù)的實(shí)用程序。以數(shù)據(jù)表為基礎(chǔ)的關(guān)系型數(shù)據(jù)庫(kù),允許在同一數(shù)據(jù)庫(kù)中存放彼此相關(guān)、卻又屬于不同種類的數(shù)據(jù)。由于數(shù)據(jù)庫(kù)架構(gòu)是根據(jù)某些特定條件和規(guī)則預(yù)先定義的,因此數(shù)據(jù)通常是按照行和列組織起來(lái),以反應(yīng)表的不同字段之間的關(guān)系。除了MySQL,我們常見(jiàn)的PostgreSQL和SQL也屬于RDBMS,它們都擁有各自對(duì)于結(jié)構(gòu)化查詢語(yǔ)言(SQL)的變體語(yǔ)言。
什么是MongoDB?
雖然MongoDB也是開(kāi)源的,但是與MySQL不同,它是一種文檔數(shù)據(jù)存儲(chǔ)庫(kù)。也就是說(shuō),它會(huì)將文檔存儲(chǔ)在集合之中,而不是存儲(chǔ)有相互關(guān)系的數(shù)據(jù)表里。
在使用MongoDB時(shí),數(shù)據(jù)模式(data schema)并不固定。用戶可以通過(guò)刪除或修改集合中的文檔屬性,以實(shí)現(xiàn)高度靈活性??v然是屬于同一個(gè)集合中的文檔,它們也會(huì)有著完全不同的結(jié)構(gòu)。
總的說(shuō)來(lái),MySQL和MongoDB的共同點(diǎn)是:它們都開(kāi)源且易于訪問(wèn)。而且,兩者都提供具有附加功能的商業(yè)版本。兩者的不同之處在于:MySQL是關(guān)系型,而MongoDB是非關(guān)系型。
MongoDB與MySQL之間的差異
下面,我們將從數(shù)據(jù)模式與能力、性能與速度、安全性、以及查詢語(yǔ)言等方面,來(lái)討論關(guān)系型的MySQL與文檔數(shù)據(jù)存儲(chǔ)類的MongoDB到底有何差異。
數(shù)據(jù)模式和能力
與JSON文檔類似,MongoDB中的數(shù)據(jù)是以鍵值對(duì)(key-value pairs)的形式顯示的。因此,在模式設(shè)計(jì)上,數(shù)據(jù)庫(kù)受到的約束更少。而這對(duì)于具有快速增長(zhǎng)或其他變化需求的數(shù)據(jù)來(lái)說(shuō),是非常有利的。如下圖所示,MongoDB提供了預(yù)定義的結(jié)構(gòu),用戶可以按需采用其結(jié)構(gòu)。
資料來(lái)源:MongoDB
雖然MySQL可以其數(shù)據(jù)模式,但不如文檔數(shù)據(jù)庫(kù)那樣靈活且動(dòng)態(tài)。在存儲(chǔ)任何數(shù)據(jù)之前,MySQL都會(huì)強(qiáng)制要求預(yù)先確定好數(shù)據(jù)表的列。而且在更改數(shù)據(jù)模式之前,用戶需要仔細(xì)考慮數(shù)據(jù)庫(kù)的數(shù)據(jù)定義語(yǔ)言(DDL)和數(shù)據(jù)建模語(yǔ)言(DML)。
雖然關(guān)系型數(shù)據(jù)庫(kù)和文檔數(shù)據(jù)庫(kù)都使用到了DDL和DML的概念,但是在關(guān)系型數(shù)據(jù)庫(kù)中,建立DDL和DML是至關(guān)重要的。相反,由于MongoDB具有可擴(kuò)展的數(shù)據(jù)模式,因此它不像MySQL那樣關(guān)注數(shù)據(jù)的結(jié)構(gòu)。當(dāng)然,這種“不靈活性”反而是MySQL的最大優(yōu)勢(shì)之一,畢竟它能夠保持?jǐn)?shù)據(jù)在結(jié)構(gòu)上的整潔與一致。
資料來(lái)源:https://dev.mysql.com/
每個(gè)MongoDB數(shù)據(jù)庫(kù)都包含了以“順次存放”的方式填充的文檔集合。由于這些文檔本身包含了各種字段和信息類型,因此它能夠存儲(chǔ)的內(nèi)容和數(shù)據(jù)大小是極其豐富的。然而在MySQL中,由于數(shù)據(jù)模式受到了極大的約束,因此數(shù)據(jù)表中的每一行都需要包含相同的特征列,而這會(huì)使得管理大量數(shù)據(jù)庫(kù)變得相當(dāng)麻煩??梢?jiàn),MySQL不能夠像MongoDB那樣可以輕松地處理大型且復(fù)雜的數(shù)據(jù)庫(kù)。換句話說(shuō),在處理大量且復(fù)雜的數(shù)據(jù)集時(shí),文檔數(shù)據(jù)庫(kù)MongoDB會(huì)比關(guān)系型數(shù)據(jù)庫(kù)MySQL更具有優(yōu)勢(shì)。
性能和速度
通常,MongoDB能夠比MySQL更快地接受更多數(shù)量的結(jié)構(gòu)化、以及非結(jié)構(gòu)化的數(shù)據(jù)。不過(guò),如果某企業(yè)日常處理的數(shù)據(jù)體量和變化頻率都不大的話,那么速度就不一定是其需要關(guān)注的方面。也就是說(shuō),諸如業(yè)務(wù)或項(xiàng)目數(shù)據(jù)的一致性、可靠性需求,都會(huì)優(yōu)先于速度被考慮到。
MySQL則是確保數(shù)據(jù)隱私和完整性的成熟方案。在其顯式架構(gòu)中,MySQL通過(guò)數(shù)據(jù)表的形式對(duì)數(shù)據(jù)類型進(jìn)行系統(tǒng)化,進(jìn)而創(chuàng)建可靠的數(shù)據(jù)庫(kù)結(jié)構(gòu),且便于用戶對(duì)表里的數(shù)據(jù)進(jìn)行便捷地查詢與搜索。不過(guò),MySQL顯然不是非結(jié)構(gòu)化數(shù)據(jù)的絕佳選擇。在使用MySQL時(shí),用戶需要事先準(zhǔn)備好數(shù)據(jù)結(jié)構(gòu)。這會(huì)最小化后期產(chǎn)生的技術(shù)債務(wù),因此這便是MySQL的最大的優(yōu)勢(shì)。不過(guò)該架構(gòu)也就限制了它對(duì)于復(fù)雜數(shù)據(jù)的靈活處置能力。
相反,由于MongoDB能夠?yàn)榉墙Y(jié)構(gòu)化數(shù)據(jù)提供靈活、快速的性能,當(dāng)用戶難以預(yù)先設(shè)計(jì)好數(shù)據(jù)模式時(shí),文檔數(shù)據(jù)存儲(chǔ)將是一個(gè)很好的選擇。當(dāng)然,如果數(shù)據(jù)種類過(guò)于豐富,用戶很難在數(shù)據(jù)屬性上創(chuàng)建出對(duì)應(yīng)的索引,那么他們就需要頻繁地優(yōu)化數(shù)據(jù)模式。而此舉則可能產(chǎn)生數(shù)據(jù)的不一致性。
安全性
MySQL采用的是基于特權(quán)的安全模型。該模型既能夠提供基本的身份驗(yàn)證,又可以在特定的數(shù)據(jù)庫(kù)上實(shí)施用戶特權(quán)的管控。在數(shù)據(jù)庫(kù)與服務(wù)器之間傳輸數(shù)據(jù)的過(guò)程中,MySQL必須采用安全套接字層(SSL,一種安全協(xié)議)的方式,來(lái)加密連接。
而MongoDB的安全性主要包括:基于角色的訪問(wèn)控制、身份驗(yàn)證、授權(quán)和審核等。當(dāng)然,如果需要加密,它也可以實(shí)施安全傳輸層(TLS)和SSL協(xié)議。
因此就安全性而言,常用業(yè)務(wù)應(yīng)用更趨向于使用成熟的MySQL來(lái)實(shí)現(xiàn)。
ACID:原子性、一致性、隔離性和持續(xù)性
眾所周知,ACID是確保數(shù)據(jù)有效性的一組數(shù)據(jù)庫(kù)事務(wù)屬性。MySQL的事務(wù)一直都能符合ACID。而追求速度和高可用性的MongoDB,在ACID方面并不占優(yōu)。直到2018年,MongoDB才在多文檔事務(wù)中滿足ACID。不過(guò),該選項(xiàng)在默認(rèn)情況下是關(guān)閉的。
查詢
當(dāng)需要從數(shù)據(jù)庫(kù)表或表的組合中請(qǐng)求信息時(shí),MySQL會(huì)使用最流行、最廣泛的查詢語(yǔ)言—SQL,通過(guò)DDL和DML與數(shù)據(jù)庫(kù)進(jìn)行通信。
而MongoDB使用的是非結(jié)構(gòu)化的查詢語(yǔ)言。為了能夠從JSON文檔數(shù)據(jù)庫(kù)處請(qǐng)求并獲取數(shù)據(jù)或信息,用戶需要事先指定與結(jié)果應(yīng)匹配的文檔屬性。換句話說(shuō),在對(duì)MongoDB數(shù)據(jù)庫(kù)執(zhí)行查詢操作之前,用戶需要用到db.collection.find()。MongoDB支持諸如:Python、Java、C#、Perl、PHP、Ruby和JavaScript等可用于構(gòu)建查詢的語(yǔ)言。通過(guò)諸如:$and、$or、$type、以及$eq等查詢操作符,用戶可以在復(fù)合查詢中,為文檔集合中的各個(gè)字段建立特定的查詢條件,并啟用查詢過(guò)濾器來(lái)過(guò)濾文件。如下圖所示,在定義了條件之后,它會(huì)標(biāo)識(shí)出符合選擇條件的信息或記錄,并對(duì)其進(jìn)行更新、讀取或刪除。
資料來(lái)源:https://docs.mongodb.com/guides/
在使用MySQL時(shí),用戶可以通過(guò)JOIN操作(如,內(nèi)部、外部、左側(cè)、右側(cè)和交叉),從兩個(gè)或多個(gè)數(shù)據(jù)庫(kù)表中檢索數(shù)據(jù)。也就是說(shuō),僅單個(gè)SQL語(yǔ)句便可獲取多個(gè)表中的關(guān)聯(lián)數(shù)據(jù)。而MongoDB并不會(huì)執(zhí)行JOIN及其等效操作。
該如何選擇MongoDB與MySQL
作為文檔數(shù)據(jù)庫(kù),由于MongoDB并不限制用戶存儲(chǔ)數(shù)據(jù)的體量和類型,因此適合大數(shù)據(jù)的應(yīng)用環(huán)境。這對(duì)基于云的服務(wù)將特別有利。而得益于MongoDB的水平可擴(kuò)展能力,以及與云服務(wù)的敏捷性結(jié)合,它不但能夠減少開(kāi)發(fā)者的工作量,簡(jiǎn)化業(yè)務(wù)與項(xiàng)目的擴(kuò)展流程,還能夠提供高可用性和數(shù)據(jù)的快速恢復(fù)。
不過(guò),MongoDB在數(shù)據(jù)的可靠性、一致性、以及安全性等方面,不如MySQL。此外,當(dāng)應(yīng)用程序需要提供多行事務(wù)(如,會(huì)計(jì)和銀行系統(tǒng))時(shí),以MySQL為首的關(guān)系型數(shù)據(jù)庫(kù)提供了高事務(wù)處理率(high transaction rate)。實(shí)際上,與MySQL專注于提供事務(wù)的ACID和安全性不同的是,MongoDB更專注于提供高插入率(high insert rate)。
因此,我強(qiáng)烈建議您將MySQL用于具有固定數(shù)據(jù)模式、且不打算在數(shù)據(jù)的多樣性方面進(jìn)行擴(kuò)展的企業(yè)或項(xiàng)目。畢竟,在確保數(shù)據(jù)完整性和可靠性的同時(shí),MySQL不但方便被維護(hù),而且成本較低。
相反,MongoDB是那些正在成長(zhǎng)、但數(shù)據(jù)架構(gòu)并不固定的業(yè)務(wù)或項(xiàng)目的最合適選擇。由于它允許開(kāi)發(fā)者在無(wú)需任何結(jié)構(gòu)的情況下,自由地更新、檢索和存儲(chǔ)文檔,因此它通常適用于需要內(nèi)容管理,物聯(lián)網(wǎng)(IoT)處理,以及實(shí)時(shí)分析等項(xiàng)目中。
小結(jié)
綜上所述,MySQL是一個(gè)開(kāi)源的關(guān)系型數(shù)據(jù)庫(kù)。其數(shù)據(jù)的組織形式為數(shù)據(jù)表,開(kāi)發(fā)者可以將目標(biāo)數(shù)據(jù)與數(shù)據(jù)庫(kù)的其他部分相關(guān)聯(lián)。MongoDB則是開(kāi)源的文檔數(shù)據(jù)庫(kù)。它既不關(guān)聯(lián)任何數(shù)據(jù)記錄,又無(wú)固定的數(shù)據(jù)模式。同時(shí),它提供高插入能力、動(dòng)態(tài)性、以及靈活的數(shù)據(jù)庫(kù)。
如前所述,由于MongoDB比MySQL更能夠處理大量的數(shù)據(jù),因此更適合那些基于云端的服務(wù)、頻繁增長(zhǎng)和變更的應(yīng)用、以及大數(shù)據(jù)的環(huán)境。相反,MySQL以其固定且結(jié)構(gòu)化的數(shù)據(jù)模式,以及符合ACID的事務(wù)特征,為數(shù)據(jù)提供了更高的一致性、可靠性和安全性??傊?,MongoDB和MySQL都很優(yōu)秀,具體如何選擇,完全取決于您的具體應(yīng)用需求和系統(tǒng)特征。
原文標(biāo)題:MongoDB Vs. MySQL: When to Use?,作者: Mariana Berga
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】