mysql與MongoDB性能對(duì)比,哪個(gè)更適合自己
MySQL與MongoDB都是開(kāi)源的常用數(shù)據(jù)庫(kù),但是MySQL是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù),MongoDB則是非關(guān)系型數(shù)據(jù)庫(kù),也叫文檔型數(shù)據(jù)庫(kù),是一種NoSQL的數(shù)據(jù)庫(kù)。它們各有各的優(yōu)點(diǎn),關(guān)鍵是看用在什么地方。所以我們所熟知的那些SQL語(yǔ)句就不適用于MongoDB了,因?yàn)镾QL語(yǔ)句是關(guān)系型數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言。
一、簡(jiǎn)單介紹
1、關(guān)系型數(shù)據(jù)庫(kù)-MySQL
1、在不同的引擎上有不同的存儲(chǔ)方式。
2、查詢(xún)語(yǔ)句是使用傳統(tǒng)的sql語(yǔ)句,擁有較為成熟的體系,成熟度很高。
3、開(kāi)源數(shù)據(jù)庫(kù)的份額在不斷增加,mysql的份額頁(yè)在持續(xù)增長(zhǎng)。
4、缺點(diǎn)就是在海量數(shù)據(jù)處理的時(shí)候效率會(huì)顯著變慢。
2、非關(guān)系型數(shù)據(jù)庫(kù)-MongoDB
非關(guān)系型數(shù)據(jù)庫(kù)(nosql ),屬于文檔型數(shù)據(jù)庫(kù)。先解釋一下文檔的數(shù)據(jù)庫(kù),即可以存放xml、json、bson類(lèi)型系那個(gè)的數(shù)據(jù)。這些數(shù)據(jù)具備自述性,呈現(xiàn)分層的樹(shù)狀數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。
1、存儲(chǔ)方式:虛擬內(nèi)存+持久化。
2、查詢(xún)語(yǔ)句:是獨(dú)特的MongoDB的查詢(xún)方式。
3、適合場(chǎng)景:事件的記錄,內(nèi)容管理或者博客平臺(tái)等等。
4、架構(gòu)特點(diǎn):可以通過(guò)副本集,以及分片來(lái)實(shí)現(xiàn)高可用。
5、數(shù)據(jù)處理:數(shù)據(jù)是存儲(chǔ)在硬盤(pán)上的,只不過(guò)需要經(jīng)常讀取的數(shù)據(jù)會(huì)被加載到內(nèi)存中,將數(shù)據(jù)存儲(chǔ)在物理內(nèi)存中,從而達(dá)到高速讀寫(xiě)。
6、成熟度與廣泛度:新興數(shù)據(jù)庫(kù),成熟度較低,Nosql數(shù)據(jù)庫(kù)中最為接近關(guān)系型數(shù)據(jù)庫(kù),比較完善的DB之一,適用人群不斷在增長(zhǎng)。
4、MongoDB優(yōu)勢(shì)與劣勢(shì)
優(yōu)勢(shì):
1、在適量級(jí)的內(nèi)存的MongoDB的性能是非常迅速的,它將熱數(shù)據(jù)存儲(chǔ)在物理內(nèi)存中,使得熱數(shù)據(jù)的讀寫(xiě)變得十分快。
2、MongoDB的高可用和集群架構(gòu)擁有十分高的擴(kuò)展性。
3、在副本集中,當(dāng)主庫(kù)遇到問(wèn)題,無(wú)法繼續(xù)提供服務(wù)的時(shí)候,副本集將選舉一個(gè)新的主庫(kù)繼續(xù)提供服務(wù)。
4、MongoDB的Bson和JSon格式的數(shù)據(jù)十分適合文檔格式的存儲(chǔ)與查詢(xún)。
劣勢(shì):
1、 不支持事務(wù)操作。MongoDB本身沒(méi)有自帶事務(wù)機(jī)制,若需要在MongoDB中實(shí)現(xiàn)事務(wù)機(jī)制,需通過(guò)一個(gè)額外的表,從邏輯上自行實(shí)現(xiàn)事務(wù)。
2、 應(yīng)用經(jīng)驗(yàn)少,由于NoSQL興起時(shí)間短,應(yīng)用經(jīng)驗(yàn)相比關(guān)系型數(shù)據(jù)庫(kù)較少。
3、MongoDB占用空間過(guò)大。
4、MongoDB和MySQL的對(duì)比(區(qū)別介紹)
數(shù)據(jù)庫(kù) | MongoDB | MySQL |
---|---|---|
數(shù)據(jù)庫(kù)模型 | 非關(guān)系型 | 關(guān)系型 |
存儲(chǔ)方式 | 以類(lèi)JSON的文檔的格式存儲(chǔ) | 不同引擎有不同的存儲(chǔ)方式 |
查詢(xún)語(yǔ)句 | MongoDB查詢(xún)方式(類(lèi)似JavaScript的函數(shù)) | SQL語(yǔ)句 |
數(shù)據(jù)處理方式 | 基于內(nèi)存,將熱數(shù)據(jù)存放在物理內(nèi)存中,從而達(dá)到高速讀寫(xiě) | 不同引擎有自己的特點(diǎn) |
成熟度 | 新興數(shù)據(jù)庫(kù),成熟度較低 | 成熟度高 |
廣泛度 | NoSQL數(shù)據(jù)庫(kù)中,比較完善且開(kāi)源,使用人數(shù)在不斷增長(zhǎng) | 開(kāi)源數(shù)據(jù)庫(kù),市場(chǎng)份額不斷增長(zhǎng) |
事務(wù)性 | 僅支持單文檔事務(wù)操作,弱一致性 | 支持事務(wù)操作 |
占用空間 | 占用空間大 | 占用空間小 |
join操作 | MongoDB沒(méi)有join | MySQL支持join |
性能方便的優(yōu)化介紹
分別從設(shè)計(jì)思想、性能、安全性、擴(kuò)展性、事務(wù)等幾個(gè)方面,來(lái)做一下比較:
mongo vs mysql
二、 設(shè)計(jì)思想的不同
以訂單為例,我們看看兩種數(shù)據(jù)庫(kù)應(yīng)該怎么設(shè)計(jì)
MySQL是這樣子的
訂單表
mysql order表結(jié)構(gòu)
訂單詳情
order item表結(jié)構(gòu)
以訂單號(hào)關(guān)聯(lián)字段。
MongoDB是 這樣子的
mongo order結(jié)構(gòu)
order_item作為訂單的子元素,是一個(gè)整體;
在一對(duì)一,一對(duì)多的場(chǎng)景,特別適合用MongoDB的內(nèi)嵌文檔和數(shù)組來(lái)存儲(chǔ),讀寫(xiě)效率都比較高。
一對(duì)多的場(chǎng)景則適合MySQL的表結(jié)構(gòu)來(lái)存儲(chǔ)。
你覺(jué)得那種存儲(chǔ)的更合理呢?
三、性能
一般情況同等條件下,MongoDB會(huì)比MySQL快 ,主要原因如下:
a.Mongo使用的內(nèi)存映射技術(shù), 寫(xiě)入數(shù)據(jù)時(shí)候只要在內(nèi)存里完成就可以返回給應(yīng)用程序,這樣并發(fā)量自然就很高。而保存到硬體的操作則在后臺(tái)異步完成。
b.MongoDB的設(shè)計(jì)要求你常用的數(shù)據(jù)(working set)可以放到內(nèi)存里。這樣大部分操作只需要讀內(nèi)存,內(nèi)存操作當(dāng)然比較快,這也是MongoDB,經(jīng)常會(huì)和redis比較的原因。前提就是要保證服務(wù)器有 足夠用的內(nèi)存,否則性能會(huì)嚴(yán)重下降。
c.數(shù)據(jù)集中存放,減少讀寫(xiě)時(shí)磁盤(pán)尋道的時(shí)間,這也是MongoDB的基本思想之一。
并發(fā)能力,具體看過(guò)有網(wǎng)友測(cè)試過(guò),MongoDB和MySQL的并發(fā)能力,借鑒一下:
并發(fā)測(cè)試結(jié)果
可見(jiàn),性能上并沒(méi)有我們想象的差距那么大,
我沒(méi)有測(cè)試過(guò),有興趣的網(wǎng)友可以測(cè)試一下
四、數(shù)據(jù)安全性
我們經(jīng)??吹叫侣劊琈ongoDB數(shù)據(jù)庫(kù)被黑,被勒索的新聞,為什么呢?
原來(lái)MongoDB 3.6版本之前,綁定的0.0.0.0的IP,即直接外網(wǎng)開(kāi)放,而且我們知道MongoDB默認(rèn)是沒(méi)有密碼的,所以很多新手弄的服務(wù)器就是在裸奔,所以被黑就在所難免的,也不能全怪MongoDB。
通過(guò)一些配置,MongoDB還是很安全的
a. 綁定本機(jī)IP ,限于局域網(wǎng)訪問(wèn);
b. 配置防火墻,禁止外部訪問(wèn)和端口探測(cè);
c. 設(shè)置合理的用戶和分派權(quán)限。道理和MySQL一樣,遵循最小權(quán)限的原則。
五、事務(wù)
早期的版本是沒(méi)有事務(wù)的,因?yàn)樵贛ongoDB中,對(duì)于單條記錄的一個(gè)操作是原子性的,一般來(lái)說(shuō),MongoDB將有關(guān)聯(lián)的數(shù)據(jù)存儲(chǔ)在一起,所以很多操作不像MySQL,需要做多表的操作。
從4.0版本開(kāi)始,MongoDB支持副本集的事務(wù),4.2支持切片的事務(wù);
對(duì)于多表事物的需求場(chǎng)景,MongoDB也是支持的,可以在多個(gè)分片、庫(kù)、表、文檔之間實(shí)現(xiàn)分布式的事務(wù)。
分布式事務(wù)會(huì)嚴(yán)重影響性能,所以要謹(jǐn)慎使用,當(dāng)需要事務(wù)時(shí),優(yōu)先考慮是否可通過(guò)合理使用MongoDB的內(nèi)嵌文檔和數(shù)組,降低使用事務(wù)的幾率。
要了解MongoDB的事務(wù),要先了解 一下MongoDB的集群。
六、擴(kuò)展性
隨著互聯(lián)網(wǎng)的發(fā)展,數(shù)據(jù)的量級(jí)也是撐指數(shù)的增長(zhǎng),從GB到TB到PB。對(duì)數(shù)據(jù)的各種操作也是愈加的困難,所以在做數(shù)據(jù)庫(kù)選型時(shí),擴(kuò)展性是必須要考慮的指標(biāo):
MongoDB提供了sharded clusters(分片集群) 和 replica sets(副本集)兩種集群模式
副本集:
架構(gòu)圖如下,目的是數(shù)據(jù)冗余和系統(tǒng)高可用,類(lèi)似于MySQL的主從架構(gòu),每個(gè)節(jié)點(diǎn)的數(shù)據(jù)是一致的,主負(fù)責(zé)讀寫(xiě)操作,從負(fù)責(zé)數(shù)據(jù)的備份,在需要的時(shí)候 可轉(zhuǎn)成主節(jié)點(diǎn)。
簡(jiǎn)單主從
如果需要做到故障自動(dòng)轉(zhuǎn)移,還需要增加一個(gè)選舉節(jié)點(diǎn),選舉節(jié)點(diǎn)只負(fù)責(zé)在主節(jié)點(diǎn)出現(xiàn)問(wèn)題時(shí),把從節(jié)點(diǎn)選舉為主節(jié)點(diǎn)。不負(fù)責(zé)數(shù)據(jù)存儲(chǔ)。這個(gè)和redis的哨兵模式類(lèi)似。
哨兵模式
關(guān)于主從的復(fù)制是一個(gè)比較復(fù)雜的過(guò)程,后面有時(shí)間再詳細(xì)介紹。
分片集群:
分片是MongoDB提供的更高級(jí)的集群模式,通過(guò)分片,把數(shù)據(jù)分配到不同的機(jī)器上,每臺(tái)機(jī)器只存儲(chǔ)了部分的數(shù)據(jù),通過(guò)mongos實(shí)現(xiàn)路由去訪問(wèn)。
切片模式架構(gòu)
這是MySQL沒(méi)有的功能,類(lèi)似于MySQL分庫(kù)分表的功能,通過(guò)mycat+mysql實(shí)現(xiàn)
6.優(yōu)勢(shì)所在
MongoDB數(shù)據(jù)類(lèi)型豐富,查詢(xún)功能強(qiáng)大,還有文本搜索功能和地理空間計(jì)算,強(qiáng)大的數(shù)據(jù)分析和統(tǒng)計(jì)能力。
缺點(diǎn):
沒(méi)有join ,連表操作能力弱,所以在復(fù)雜查詢(xún)時(shí),還是關(guān)系型數(shù)據(jù)庫(kù)更勝一籌。
7.隔離級(jí)別
這是MySQL里的概念,在MongoDB事務(wù)提交前,事務(wù)外看不到本次修改的內(nèi)容,隔離級(jí)別類(lèi)似MySQL默認(rèn)的隔離級(jí)別,“可重復(fù)讀”的級(jí)別。
綜上所述,總結(jié)一下
什么時(shí)候適合用MongoDB:
1. 數(shù)據(jù)結(jié)構(gòu)不確定,可能發(fā)生改動(dòng)的場(chǎng)景;
2.事務(wù)安全性要求不高,數(shù)據(jù)擴(kuò)展要求較高的時(shí)候;
什么時(shí)候用MySQL:
1. 有事務(wù)要求,強(qiáng)一致性要求較高,涉及到金錢(qián)的時(shí)候;
2. 邏輯復(fù)雜,有較多join的需求;
沒(méi)有最好的,只有最合適的,適合自己業(yè)務(wù)的就是最好的!
相關(guān)文章
StarRocks數(shù)據(jù)庫(kù)詳解(什么是StarRocks)
StarRocks是一個(gè)高性能的全場(chǎng)景MPP數(shù)據(jù)庫(kù),支持多種數(shù)據(jù)導(dǎo)入導(dǎo)出方式,包括Spark、Flink、Hadoop等,它采用分布式架構(gòu),支持多副本和彈性容錯(cuò),本文介紹StarRocks詳解,感興趣的朋友一起看看吧2025-03-03Access轉(zhuǎn)換成SQL Server需要注意事項(xiàng)整理
很多朋友想用SQL2000數(shù)據(jù)庫(kù)的編程方法,但是卻又苦于自己是學(xué)ACCESS的,對(duì)SQL只是一點(diǎn)點(diǎn)的了解而已,這里我給大家提供以下參考---將ACCESS轉(zhuǎn)化成SQL2000的方法和注意事項(xiàng)2008-04-04Clickhouse系列之整合Hive數(shù)據(jù)倉(cāng)庫(kù)示例詳解
這篇文章主要為大家介紹了Clickhouse系列之整合Hive數(shù)據(jù)倉(cāng)庫(kù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10一些關(guān)于數(shù)據(jù)存儲(chǔ)和查詢(xún)優(yōu)化的想法
今天咨詢(xún)了一下高手,關(guān)于數(shù)據(jù)存儲(chǔ)和查詢(xún)的問(wèn)題,最終目的就是快,大家可以適當(dāng)?shù)氖褂?/div> 2012-05-05[數(shù)據(jù)庫(kù)] 通用分頁(yè)存儲(chǔ)過(guò)程
[數(shù)據(jù)庫(kù)] 通用分頁(yè)存儲(chǔ)過(guò)程...2007-02-02Navicat導(dǎo)入海量Excel數(shù)據(jù)到數(shù)據(jù)庫(kù)的流程步驟
Navicat 是一款功能強(qiáng)大的數(shù)據(jù)庫(kù)管理工具,支持多種數(shù)據(jù)庫(kù)系統(tǒng),它提供便捷的數(shù)據(jù)導(dǎo)入功能,可以將 Excel 數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)中,本文給大家介紹了Navicat導(dǎo)入海量Excel數(shù)據(jù)到數(shù)據(jù)庫(kù)的流程步驟,文章通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02GaussDB數(shù)據(jù)庫(kù)何創(chuàng)建修改數(shù)據(jù)庫(kù)和數(shù)據(jù)表的方法
GaussDB 是一款由華為開(kāi)發(fā)的企業(yè)級(jí)分布式數(shù)據(jù)庫(kù),具有高性能、高可用、高可靠性等特點(diǎn),廣泛應(yīng)用于各種業(yè)務(wù)場(chǎng)景,本指南將介紹如何在 GaussDB 中創(chuàng)建數(shù)據(jù)庫(kù)和數(shù)據(jù)表,修改表結(jié)構(gòu),并添加約束,需要的朋友可以參考下2024-06-06ACCESS轉(zhuǎn)化成SQL2000需要注意的幾個(gè)問(wèn)題小結(jié)
ACCESS轉(zhuǎn)化成SQL2000需要注意的幾個(gè)問(wèn)題小結(jié)...2007-06-06最新評(píng)論