mysql與MongoDB性能對比,哪個更適合自己
MySQL與MongoDB都是開源的常用數(shù)據(jù)庫,但是MySQL是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,MongoDB則是非關(guān)系型數(shù)據(jù)庫,也叫文檔型數(shù)據(jù)庫,是一種NoSQL的數(shù)據(jù)庫。它們各有各的優(yōu)點,關(guān)鍵是看用在什么地方。所以我們所熟知的那些SQL語句就不適用于MongoDB了,因為SQL語句是關(guān)系型數(shù)據(jù)庫的標準語言。
一、簡單介紹
1、關(guān)系型數(shù)據(jù)庫-MySQL
1、在不同的引擎上有不同的存儲方式。
2、查詢語句是使用傳統(tǒng)的sql語句,擁有較為成熟的體系,成熟度很高。
3、開源數(shù)據(jù)庫的份額在不斷增加,mysql的份額頁在持續(xù)增長。
4、缺點就是在海量數(shù)據(jù)處理的時候效率會顯著變慢。
2、非關(guān)系型數(shù)據(jù)庫-MongoDB
非關(guān)系型數(shù)據(jù)庫(nosql ),屬于文檔型數(shù)據(jù)庫。先解釋一下文檔的數(shù)據(jù)庫,即可以存放xml、json、bson類型系那個的數(shù)據(jù)。這些數(shù)據(jù)具備自述性,呈現(xiàn)分層的樹狀數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對組成。
1、存儲方式:虛擬內(nèi)存+持久化。
2、查詢語句:是獨特的MongoDB的查詢方式。
3、適合場景:事件的記錄,內(nèi)容管理或者博客平臺等等。
4、架構(gòu)特點:可以通過副本集,以及分片來實現(xiàn)高可用。
5、數(shù)據(jù)處理:數(shù)據(jù)是存儲在硬盤上的,只不過需要經(jīng)常讀取的數(shù)據(jù)會被加載到內(nèi)存中,將數(shù)據(jù)存儲在物理內(nèi)存中,從而達到高速讀寫。
6、成熟度與廣泛度:新興數(shù)據(jù)庫,成熟度較低,Nosql數(shù)據(jù)庫中最為接近關(guān)系型數(shù)據(jù)庫,比較完善的DB之一,適用人群不斷在增長。
4、MongoDB優(yōu)勢與劣勢
優(yōu)勢:
1、在適量級的內(nèi)存的MongoDB的性能是非常迅速的,它將熱數(shù)據(jù)存儲在物理內(nèi)存中,使得熱數(shù)據(jù)的讀寫變得十分快。
2、MongoDB的高可用和集群架構(gòu)擁有十分高的擴展性。
3、在副本集中,當主庫遇到問題,無法繼續(xù)提供服務(wù)的時候,副本集將選舉一個新的主庫繼續(xù)提供服務(wù)。
4、MongoDB的Bson和JSon格式的數(shù)據(jù)十分適合文檔格式的存儲與查詢。
劣勢:
1、 不支持事務(wù)操作。MongoDB本身沒有自帶事務(wù)機制,若需要在MongoDB中實現(xiàn)事務(wù)機制,需通過一個額外的表,從邏輯上自行實現(xiàn)事務(wù)。
2、 應(yīng)用經(jīng)驗少,由于NoSQL興起時間短,應(yīng)用經(jīng)驗相比關(guān)系型數(shù)據(jù)庫較少。
3、MongoDB占用空間過大。
4、MongoDB和MySQL的對比(區(qū)別介紹)
| 數(shù)據(jù)庫 | MongoDB | MySQL |
|---|---|---|
| 數(shù)據(jù)庫模型 | 非關(guān)系型 | 關(guān)系型 |
| 存儲方式 | 以類JSON的文檔的格式存儲 | 不同引擎有不同的存儲方式 |
| 查詢語句 | MongoDB查詢方式(類似JavaScript的函數(shù)) | SQL語句 |
| 數(shù)據(jù)處理方式 | 基于內(nèi)存,將熱數(shù)據(jù)存放在物理內(nèi)存中,從而達到高速讀寫 | 不同引擎有自己的特點 |
| 成熟度 | 新興數(shù)據(jù)庫,成熟度較低 | 成熟度高 |
| 廣泛度 | NoSQL數(shù)據(jù)庫中,比較完善且開源,使用人數(shù)在不斷增長 | 開源數(shù)據(jù)庫,市場份額不斷增長 |
| 事務(wù)性 | 僅支持單文檔事務(wù)操作,弱一致性 | 支持事務(wù)操作 |
| 占用空間 | 占用空間大 | 占用空間小 |
| join操作 | MongoDB沒有join | MySQL支持join |
性能方便的優(yōu)化介紹
分別從設(shè)計思想、性能、安全性、擴展性、事務(wù)等幾個方面,來做一下比較:
mongo vs mysql
二、 設(shè)計思想的不同
以訂單為例,我們看看兩種數(shù)據(jù)庫應(yīng)該怎么設(shè)計
MySQL是這樣子的
訂單表
mysql order表結(jié)構(gòu)
訂單詳情
order item表結(jié)構(gòu)
以訂單號關(guān)聯(lián)字段。
MongoDB是 這樣子的
mongo order結(jié)構(gòu)
order_item作為訂單的子元素,是一個整體;
在一對一,一對多的場景,特別適合用MongoDB的內(nèi)嵌文檔和數(shù)組來存儲,讀寫效率都比較高。
一對多的場景則適合MySQL的表結(jié)構(gòu)來存儲。
你覺得那種存儲的更合理呢?
三、性能
一般情況同等條件下,MongoDB會比MySQL快 ,主要原因如下:
a.Mongo使用的內(nèi)存映射技術(shù), 寫入數(shù)據(jù)時候只要在內(nèi)存里完成就可以返回給應(yīng)用程序,這樣并發(fā)量自然就很高。而保存到硬體的操作則在后臺異步完成。
b.MongoDB的設(shè)計要求你常用的數(shù)據(jù)(working set)可以放到內(nèi)存里。這樣大部分操作只需要讀內(nèi)存,內(nèi)存操作當然比較快,這也是MongoDB,經(jīng)常會和redis比較的原因。前提就是要保證服務(wù)器有 足夠用的內(nèi)存,否則性能會嚴重下降。
c.數(shù)據(jù)集中存放,減少讀寫時磁盤尋道的時間,這也是MongoDB的基本思想之一。
并發(fā)能力,具體看過有網(wǎng)友測試過,MongoDB和MySQL的并發(fā)能力,借鑒一下:
并發(fā)測試結(jié)果
可見,性能上并沒有我們想象的差距那么大,
我沒有測試過,有興趣的網(wǎng)友可以測試一下
四、數(shù)據(jù)安全性
我們經(jīng)常看到新聞,MongoDB數(shù)據(jù)庫被黑,被勒索的新聞,為什么呢?
原來MongoDB 3.6版本之前,綁定的0.0.0.0的IP,即直接外網(wǎng)開放,而且我們知道MongoDB默認是沒有密碼的,所以很多新手弄的服務(wù)器就是在裸奔,所以被黑就在所難免的,也不能全怪MongoDB。
通過一些配置,MongoDB還是很安全的
a. 綁定本機IP ,限于局域網(wǎng)訪問;
b. 配置防火墻,禁止外部訪問和端口探測;
c. 設(shè)置合理的用戶和分派權(quán)限。道理和MySQL一樣,遵循最小權(quán)限的原則。
五、事務(wù)
早期的版本是沒有事務(wù)的,因為在MongoDB中,對于單條記錄的一個操作是原子性的,一般來說,MongoDB將有關(guān)聯(lián)的數(shù)據(jù)存儲在一起,所以很多操作不像MySQL,需要做多表的操作。
從4.0版本開始,MongoDB支持副本集的事務(wù),4.2支持切片的事務(wù);
對于多表事物的需求場景,MongoDB也是支持的,可以在多個分片、庫、表、文檔之間實現(xiàn)分布式的事務(wù)。
分布式事務(wù)會嚴重影響性能,所以要謹慎使用,當需要事務(wù)時,優(yōu)先考慮是否可通過合理使用MongoDB的內(nèi)嵌文檔和數(shù)組,降低使用事務(wù)的幾率。
要了解MongoDB的事務(wù),要先了解 一下MongoDB的集群。
六、擴展性
隨著互聯(lián)網(wǎng)的發(fā)展,數(shù)據(jù)的量級也是撐指數(shù)的增長,從GB到TB到PB。對數(shù)據(jù)的各種操作也是愈加的困難,所以在做數(shù)據(jù)庫選型時,擴展性是必須要考慮的指標:
MongoDB提供了sharded clusters(分片集群) 和 replica sets(副本集)兩種集群模式
副本集:
架構(gòu)圖如下,目的是數(shù)據(jù)冗余和系統(tǒng)高可用,類似于MySQL的主從架構(gòu),每個節(jié)點的數(shù)據(jù)是一致的,主負責讀寫操作,從負責數(shù)據(jù)的備份,在需要的時候 可轉(zhuǎn)成主節(jié)點。

簡單主從
如果需要做到故障自動轉(zhuǎn)移,還需要增加一個選舉節(jié)點,選舉節(jié)點只負責在主節(jié)點出現(xiàn)問題時,把從節(jié)點選舉為主節(jié)點。不負責數(shù)據(jù)存儲。這個和redis的哨兵模式類似。

哨兵模式
關(guān)于主從的復(fù)制是一個比較復(fù)雜的過程,后面有時間再詳細介紹。
分片集群:
分片是MongoDB提供的更高級的集群模式,通過分片,把數(shù)據(jù)分配到不同的機器上,每臺機器只存儲了部分的數(shù)據(jù),通過mongos實現(xiàn)路由去訪問。

切片模式架構(gòu)
這是MySQL沒有的功能,類似于MySQL分庫分表的功能,通過mycat+mysql實現(xiàn)
6.優(yōu)勢所在
MongoDB數(shù)據(jù)類型豐富,查詢功能強大,還有文本搜索功能和地理空間計算,強大的數(shù)據(jù)分析和統(tǒng)計能力。
缺點:
沒有join ,連表操作能力弱,所以在復(fù)雜查詢時,還是關(guān)系型數(shù)據(jù)庫更勝一籌。
7.隔離級別
這是MySQL里的概念,在MongoDB事務(wù)提交前,事務(wù)外看不到本次修改的內(nèi)容,隔離級別類似MySQL默認的隔離級別,“可重復(fù)讀”的級別。
綜上所述,總結(jié)一下
什么時候適合用MongoDB:
1. 數(shù)據(jù)結(jié)構(gòu)不確定,可能發(fā)生改動的場景;
2.事務(wù)安全性要求不高,數(shù)據(jù)擴展要求較高的時候;
什么時候用MySQL:
1. 有事務(wù)要求,強一致性要求較高,涉及到金錢的時候;
2. 邏輯復(fù)雜,有較多join的需求;
沒有最好的,只有最合適的,適合自己業(yè)務(wù)的就是最好的!
相關(guān)文章
StarRocks數(shù)據(jù)庫詳解(什么是StarRocks)
StarRocks是一個高性能的全場景MPP數(shù)據(jù)庫,支持多種數(shù)據(jù)導(dǎo)入導(dǎo)出方式,包括Spark、Flink、Hadoop等,它采用分布式架構(gòu),支持多副本和彈性容錯,本文介紹StarRocks詳解,感興趣的朋友一起看看吧2025-03-03
Access轉(zhuǎn)換成SQL Server需要注意事項整理
很多朋友想用SQL2000數(shù)據(jù)庫的編程方法,但是卻又苦于自己是學(xué)ACCESS的,對SQL只是一點點的了解而已,這里我給大家提供以下參考---將ACCESS轉(zhuǎn)化成SQL2000的方法和注意事項2008-04-04
Clickhouse系列之整合Hive數(shù)據(jù)倉庫示例詳解
這篇文章主要為大家介紹了Clickhouse系列之整合Hive數(shù)據(jù)倉庫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
一些關(guān)于數(shù)據(jù)存儲和查詢優(yōu)化的想法
今天咨詢了一下高手,關(guān)于數(shù)據(jù)存儲和查詢的問題,最終目的就是快,大家可以適當?shù)氖褂?/div> 2012-05-05
Navicat導(dǎo)入海量Excel數(shù)據(jù)到數(shù)據(jù)庫的流程步驟
Navicat 是一款功能強大的數(shù)據(jù)庫管理工具,支持多種數(shù)據(jù)庫系統(tǒng),它提供便捷的數(shù)據(jù)導(dǎo)入功能,可以將 Excel 數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫中,本文給大家介紹了Navicat導(dǎo)入海量Excel數(shù)據(jù)到數(shù)據(jù)庫的流程步驟,文章通過圖文介紹的非常詳細,需要的朋友可以參考下2025-02-02
GaussDB數(shù)據(jù)庫何創(chuàng)建修改數(shù)據(jù)庫和數(shù)據(jù)表的方法
GaussDB 是一款由華為開發(fā)的企業(yè)級分布式數(shù)據(jù)庫,具有高性能、高可用、高可靠性等特點,廣泛應(yīng)用于各種業(yè)務(wù)場景,本指南將介紹如何在 GaussDB 中創(chuàng)建數(shù)據(jù)庫和數(shù)據(jù)表,修改表結(jié)構(gòu),并添加約束,需要的朋友可以參考下2024-06-06
ACCESS轉(zhuǎn)化成SQL2000需要注意的幾個問題小結(jié)
ACCESS轉(zhuǎn)化成SQL2000需要注意的幾個問題小結(jié)...2007-06-06最新評論

