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