欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

mysql與MongoDB性能對(duì)比,哪個(gè)更適合自己

 更新時(shí)間:2023年06月03日 13:25:50   投稿:mdxy-dxy  
經(jīng)常看到有人討論,mongodb性能不如MySQL,MySQL能不能代替之類(lèi)的說(shuō)法?,其實(shí)作為技術(shù)人,很不喜歡哪個(gè)比哪個(gè)好這種說(shuō)法,基本就是挑事,我們今天一起

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ù)MongoDBMySQL
數(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)有joinMySQL支持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)文章

最新評(píng)論