MySQL與MongoDB,該如何做技術(shù)選型?
引言
一般情況下,會(huì)考慮到MySQL與MongoDB如何做技術(shù)選型的時(shí)候,你一定是遇到了類似于非結(jié)構(gòu)化數(shù)據(jù)JSON的存取難題,否則大家都直接MySQL開始搞起了。
為什么要關(guān)注MongoDB呢?
下圖是DB-Engines 2023年10月數(shù)據(jù)庫的排名統(tǒng)計(jì),可以看到MongoDB總排名在第5,在Nosql數(shù)據(jù)庫中排名第1。
圖片
既然要做技術(shù)選型,那就先要弄明白其中的一些區(qū)別和差異。
一、什么是MySQL?
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),屬于 Oracle 旗下產(chǎn)品。MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是最好的RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一。
主要特點(diǎn):
1、強(qiáng)大的體系結(jié)構(gòu)
2、集群架構(gòu)的多樣性
3、完整的復(fù)制體系
4、強(qiáng)大的多行事務(wù)的支持
5、不同的插件式存儲(chǔ)引擎的支持(InnoDB)
6、第三方工具種類豐富,社區(qū)用戶活躍
二、什么是MongoDB?
MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫。由C++語言編寫,旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。
MongoDB將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對組成。MongoDB文檔類似于JSON 對象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。
主要特點(diǎn):
1、文檔模式,無結(jié)構(gòu)化數(shù)據(jù),靈活的數(shù)據(jù)結(jié)構(gòu),適合快速開發(fā),迭代場景
2、功能強(qiáng)大,位置索引、文本索引、TTL索引
3、副本集自動(dòng)切換,保證數(shù)據(jù)的高可靠,服務(wù)的高可用性。
4、自動(dòng)分片,存儲(chǔ)容量、服務(wù)能力橫向能力
5、適應(yīng)于物流,物聯(lián)網(wǎng)等海量數(shù)據(jù)場景
6、aggregation & mapreduce
三、MongoDB與MySQL之間的差異
3.1 相關(guān)概念及術(shù)語的差異
圖片
3.2 存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)的差異
MySQL 的存儲(chǔ)結(jié)構(gòu)分為5 級:表空間、段、簇、頁、行。表空間可以看做是InnoDB 存儲(chǔ)引擎邏輯結(jié)構(gòu)的最高層,所有的數(shù)據(jù)都存放在表空間中。
MySQL 不同引擎有不同的存儲(chǔ)方式,而 MongoDB 以類JSON的文檔的格式存儲(chǔ)。
圖片
3.3 增刪改查操作的差異
當(dāng)從數(shù)據(jù)庫表或表組合中請求信息時(shí),MySQL 使用 結(jié)構(gòu)化查詢語言(SQL),SQL是最流行和利用最廣泛的查詢語言,大多數(shù)開發(fā)人員都有這方面的經(jīng)驗(yàn)。
相反,MongoDB 則使用非結(jié)構(gòu)化查詢語言(MQL)。要從JSON文檔數(shù)據(jù)庫請求數(shù)據(jù)或信息,首先必須指定具有結(jié)果應(yīng)匹配的屬性的文檔。
盡管 MQL 和 SQL 有相似之處,但 MQL 通常需要額外花費(fèi)精力進(jìn)行學(xué)習(xí)。
圖片
3.4 事務(wù)支持的差異
當(dāng)應(yīng)用程序類型需要多行事務(wù)時(shí),關(guān)系數(shù)據(jù)庫是最合適的選擇。除了提供安全性,MySQL還實(shí)現(xiàn)了高事務(wù)處理率。而 MongoDB 僅支持單文檔事務(wù)操作,弱一致性。
圖片
3.5 性能測試總結(jié)分析
- 插入速度總結(jié):MongoDB不指定_id插入 > MySQL不指定主鍵插入 > MySQL指定主鍵插入 > MongoDB指定_id插入。
- MongoDB在指定_id插入的時(shí)候,插入性能下降非常厲害。
- MySQL非常穩(wěn)定,無論在指定主鍵還是在不指定主鍵插入的情況下,其效率都差不了。
- MongoDB會(huì)充分利用內(nèi)存作為緩存。
3.6 其他主要差異
接下來,我們將介紹一些其他主要差異。
圖片
四、應(yīng)用場景分析
作為文檔數(shù)據(jù)庫,由于MongoDB并不限制用戶存儲(chǔ)數(shù)據(jù)的體量和類型,因此適合大數(shù)據(jù)的應(yīng)用環(huán)境。而得益于MongoDB的水平可擴(kuò)展能力,以及與云服務(wù)的敏捷性結(jié)合,它不但能夠減少開發(fā)者的工作量,簡化業(yè)務(wù)與項(xiàng)目的擴(kuò)展流程,還能夠提供高可用性和數(shù)據(jù)的快速恢復(fù)。
不過,MongoDB在數(shù)據(jù)的可靠性、一致性、以及安全性等方面,不如MySQL。此外,當(dāng)應(yīng)用程序需要提供多行事務(wù)(如,會(huì)計(jì)和銀行系統(tǒng))時(shí),以MySQL為首的關(guān)系型數(shù)據(jù)庫提供了高事務(wù)處理率(high transaction rate)。實(shí)際上,與MySQL專注于提供事務(wù)的ACID和安全性不同的是,MongoDB更專注于提供高插入率(high insert rate)。
MongoDB 的應(yīng)用已經(jīng)滲透到各個(gè)領(lǐng)域,比如游戲、物流、電商、內(nèi)容管理、社交、物聯(lián)網(wǎng)、視頻直播等。
圖片
總結(jié)
綜上所述,MySQL是一個(gè)開放源代碼的關(guān)系數(shù)據(jù)庫,這意味著它的數(shù)據(jù)被組織成表格,使您可以將數(shù)據(jù)與數(shù)據(jù)庫的其他部分相關(guān)聯(lián)。MongoDB也是開源的,但是,它是一個(gè)文檔數(shù)據(jù)庫。因此,它不關(guān)聯(lián)記錄,并且其數(shù)據(jù)模式是不固定的,從而允許具有更高插入能力的更具動(dòng)態(tài)性和靈活性的數(shù)據(jù)庫。
圖片
在確定最佳數(shù)據(jù)庫系統(tǒng)之前,應(yīng)明確并確定特定業(yè)務(wù)或項(xiàng)目的優(yōu)先級。
- MongoDB比MySQL更能處理大量數(shù)據(jù)
- 因此,對于基于云的服務(wù),易于增長和更改的應(yīng)用程序以及數(shù)據(jù)量大的環(huán)境,它是最合適的選擇。
- 相反,MySQL的固定和結(jié)構(gòu)化數(shù)據(jù)模式提供了比大多數(shù)數(shù)據(jù)庫更高的一致性和可靠性。
- 使用MySQL的另一個(gè)巨大好處是,由于符合ACID的事務(wù)而具有卓越的數(shù)據(jù)安全性,是重視此功能的應(yīng)用程序的最合適選擇。
總之,MongoDB和MySQL都很優(yōu)秀,具體如何選擇,完全取決于您的具體應(yīng)用需求和系統(tǒng)特征。