您好,登錄后才能下訂單哦!
PG和MySQL到底哪個(gè)更好用,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
概述
小編介紹MySQL和PostgreSQL的一些特性對(duì)比,讓大家了解二者的優(yōu)劣,更好的做出選擇。當(dāng)前國(guó)內(nèi)的現(xiàn)狀,互聯(lián)網(wǎng)公司使用MySQL的較多,PostgreSQL的使用比例反而不高,但相信看到PG的新特性后,你會(huì)愛上她。當(dāng)然MySQL作為最流行的數(shù)據(jù)庫,依然會(huì)吸引大部分人的眼球。
PostgreSQL標(biāo)榜自己是世界上最先進(jìn)的開源數(shù)據(jù)庫,甚至PG粉絲或者一些PGER宣稱,她可以和Oracle相媲美(雖然PG很強(qiáng)大,但是和Oracle還是有差距的,當(dāng)然PG優(yōu)勢(shì)也是顯而易見的),而且沒有那么昂貴的價(jià)格和傲慢的客服。
當(dāng)然PG功能完善和強(qiáng)大是最早始于9版本,在10版本快速發(fā)展,增加很多功能和特性。PostgreSQL是完全由社區(qū)驅(qū)動(dòng)的開源項(xiàng)目,他的核心代碼,都是由社區(qū)維護(hù),商用版本都是基于PG做的二次開發(fā)。
MySQL 聲稱自己是最流行的開源數(shù)據(jù)??船F(xiàn)在國(guó)內(nèi)的現(xiàn)狀,稱得上名副其實(shí)。MySQL被賣幾次后,最終落到Oracle公司的囊中。正是因此,MySQL之父Monty,修改了MySQL的源代碼,創(chuàng)立了MariaDB分支。
說到這里當(dāng)然不得不提另一個(gè)重要的分支,Percana公司的Percona Server。Percona公司更擅長(zhǎng)MySQL運(yùn)維,開發(fā)了很多非常實(shí)用運(yùn)維工具,而且都已經(jīng)開源,并回饋給社區(qū),像XtraBackup和pt-Toolkits工具。
簡(jiǎn)單對(duì)比MySQL和PostgreSQL發(fā)現(xiàn),MySQL背后是成熟的商業(yè)公司(Oracle有自己的MySQL企業(yè)版,收費(fèi),有許多社區(qū)版沒有的特性),而PostgreSQL背后是一個(gè)龐大的志愿開發(fā)組,相比而言,PostgreSQL的商業(yè)性質(zhì)更少一些,他沒有所謂的PostgreSQL企業(yè)版,但是存在基于PG開發(fā)的一些企業(yè)級(jí)的PG數(shù)據(jù)庫。
下面我將從以下幾個(gè)方面闡述MySQL和PostgreSQL的異同和優(yōu)劣,由于筆者水平的限制,不當(dāng)之處,還請(qǐng)大家多提意見。
一、開源方面
PostgreSQL: The world’s most advanced open source database。
開源協(xié)議:PostgreSQL基于自由的BSD/MIT許可,組織可以使用、復(fù)制、修改和重新分發(fā)代碼,只需要提供一個(gè)版權(quán)聲明即可。
PG的開源協(xié)議特別靈活,任何公司的和個(gè)人都可以把PG作為一個(gè)產(chǎn)品銷售,而不需要像MySQL那樣必須修改大部分代碼才可以作為公司的產(chǎn)品。
MySQL:World’s Most Popular Open Source Database。
開源協(xié)議:核心代碼基于GPL或Commercial License。
MySQL的開源協(xié)議是基于GPL協(xié)議,任何公司都可以免費(fèi)使用,不允許修改后和衍生的代碼做為閉源的商業(yè)軟件發(fā)布和銷售,MySQL的版權(quán)在甲骨文手中,甲骨文可以推了其商業(yè)閉源版本。
如上圖所示,開源軟件協(xié)議
二、ACID支持方面
PostgreSQL支持事務(wù)的強(qiáng)一致性,事務(wù)保證性好,完全支持ACID特性。
MySQL只有innodb引擎支持事務(wù),事務(wù)一致性保證上可根據(jù)實(shí)際需求調(diào)整,為了最大限度的保護(hù)數(shù)據(jù),MySQL可配置雙一模式,對(duì)ACID的支持上比PG稍弱弱。
三、SQL標(biāo)準(zhǔn)的支持方面
PostgreSQL幾乎支持所有的SQL標(biāo)準(zhǔn),支持類型相當(dāng)豐富。
MySQL只支持部分SQL標(biāo)準(zhǔn),相比于PG支持類型稍弱。
四、復(fù)制
MySQL的復(fù)制是基于binlog的邏輯異步復(fù)制,無法實(shí)現(xiàn)同步復(fù)制。
復(fù)制模式:
一主一備。
一主多備。
級(jí)聯(lián)復(fù)制。
循環(huán)復(fù)制。
主主復(fù)制。
數(shù)據(jù)流轉(zhuǎn)優(yōu)勢(shì):通過canal增量數(shù)據(jù)的訂閱和消費(fèi),可以同步數(shù)據(jù)到kafka,通過kafka做數(shù)據(jù)流轉(zhuǎn)。
MySQL所有的高可用方案都是基于binlog做的同步,以及基于MySQL的分布式數(shù)據(jù)也是基于MySQL的binlog實(shí)現(xiàn),binlog是MySQL生態(tài)圈最基本技術(shù)實(shí)現(xiàn)。
PostgreSQL可以做到同步,異步,半同步復(fù)制,以及基于日志邏輯復(fù)制,可以實(shí)現(xiàn)表級(jí)別的訂閱和發(fā)布。
復(fù)制模式:
一主一備。
一主多備。
級(jí)聯(lián)復(fù)制。
熱備庫/流復(fù)制。
邏輯復(fù)制。
數(shù)據(jù)流轉(zhuǎn)優(yōu)勢(shì):通過邏輯復(fù)制實(shí)現(xiàn)消息的訂閱和消費(fèi),可以同步數(shù)據(jù)到kafka,通過kafka實(shí)現(xiàn)數(shù)據(jù)流轉(zhuǎn)。
五、并發(fā)控制
PostgreSQL通過其MVCC實(shí)現(xiàn)有效地解決了并發(fā)問題,從而實(shí)現(xiàn)了非常高的并發(fā)性。
PG新老數(shù)據(jù)一起存放的基于XID的MVCC機(jī)制,新老數(shù)據(jù)一起存放,需要定時(shí)觸 發(fā)VACUUM,會(huì)帶來多余的IO和數(shù)據(jù)庫對(duì)象加鎖開銷,引起數(shù)據(jù)庫整體的并發(fā)能力下降。而且VACUUM清理不及時(shí),還可能會(huì)引發(fā)數(shù)據(jù)膨脹。
當(dāng)然PostgreSQL還有一點(diǎn)影響比較,為了保證事務(wù)的強(qiáng)一致性,未決事務(wù)會(huì)影響所有表VACUUM清理,導(dǎo)致表膨脹。
MySQL僅在InnoDB中支持MVCC。
innodb的基于回滾段實(shí)現(xiàn)的MVCC機(jī)制,但是MySQL的間隙鎖影響較大,鎖定數(shù)據(jù)較多。
六、性能
1、PostgreSQL
1)PostgreSQL廣泛用于讀寫速度高和數(shù)據(jù)一致性高的大型系統(tǒng)。此外,它還支持各種性能優(yōu)化,當(dāng)然這些優(yōu)化僅在商業(yè)解決方案中可用,例如地理空間數(shù)據(jù)支持,沒有讀鎖定的并發(fā)性等等。
2)PostgreSQL性能最適用于需要執(zhí)行復(fù)雜查詢的系統(tǒng)。
3)PostgreSQL在OLTP/ OLAP系統(tǒng)中表現(xiàn)良好,讀寫速度以及大數(shù)據(jù)分析方面表現(xiàn)良好,基于PG的GP數(shù)據(jù)庫,在數(shù)據(jù)倉庫領(lǐng)域表現(xiàn)良好。
4)PostgreSQL也適用于商業(yè)智能應(yīng)用程序,但更適合需要快速讀/寫速度的數(shù)據(jù)倉庫和數(shù)據(jù)分析應(yīng)用程序。
2、MySQL
1)MySQL是廣泛選擇的基于Web的項(xiàng)目,需要數(shù)據(jù)庫只是為了簡(jiǎn)單的數(shù)據(jù)事務(wù)。但是,當(dāng)遇到重負(fù)載或嘗試完成復(fù)雜查詢時(shí),MySQL通常會(huì)表現(xiàn)不佳。
2)MySQL的讀取速度,在OLTP系統(tǒng)中表現(xiàn)良好。
3)MySQL + InnoDB為OLTP場(chǎng)景提供了非常好的讀/寫速度??傮w而言,MySQL在高并發(fā)場(chǎng)景下表現(xiàn)良好。
4)MySQL是可靠的,并且與商業(yè)智能應(yīng)用程序配合良好,因?yàn)樯虡I(yè)智能應(yīng)用程序通常讀取很多。
七、高可用技術(shù)的實(shí)現(xiàn)
1、PostgreSQL
1)基于流復(fù)制的異步、同步主從。
2)基于流復(fù)制的–keepalive。
3)基于流復(fù)制的 –repmgr。
4)基于流復(fù)制的 –patroni+etcd。
5)共享存儲(chǔ)HA(corosync+pacemaker)。
6)Postgres-XC。
7)Postgres-XL。
8)中間件實(shí)現(xiàn):pgpool、pgcluster、slony、plploxy。
2、MySQL
1)主從復(fù)制。
2)主主復(fù)。
3)MHA。
4)LVS+KEEPALIVE。
5)MGR分布式數(shù)據(jù)庫,多點(diǎn)寫入[不建議],基于paxos協(xié)議。
6)PXC分布式數(shù)據(jù)庫,多點(diǎn)寫入[不建議],基于令牌環(huán)協(xié)議。
7)INNODB CLUSTER[8.0新技術(shù),基于MGR實(shí)現(xiàn),上層封裝命令],基于paxos協(xié)議。
8)中間件實(shí)現(xiàn):mycat。
八、外部數(shù)據(jù)源
PostgreSQL FDW –[foreign-data wrapper的一個(gè)簡(jiǎn)稱,可以叫外部封裝。
PostgreSQL不支持多數(shù)據(jù)引擎。但支持Extension組件擴(kuò)充,以及通過名為FDW的技術(shù)將Oracle、Hadoop、MongoDB、SQLServer、Excel、CSV文件等作為外部表進(jìn)行讀寫操作,因此,可以為大數(shù)據(jù)與關(guān)系型數(shù)據(jù)庫提供良好對(duì)接。
MySQL:無。
九、數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)類型
PG主表采用堆表存放,存放的數(shù)據(jù)量較大,數(shù)據(jù)訪問方式類似于Oracle的堆表。
MySQL采用索引組織表,MySQL必須有主鍵索引,所有的數(shù)據(jù)訪問都是通過主鍵實(shí)現(xiàn),二級(jí)索引訪問時(shí),需要掃描兩遍索引(主鍵和二級(jí)索引)。
十、PostgreSQL與MySQL優(yōu)劣對(duì)比
1、PostgreSQL相對(duì)于MySQL的優(yōu)勢(shì)
1)在SQL的標(biāo)準(zhǔn)實(shí)現(xiàn)上要比MySQL完善,而且功能實(shí)現(xiàn)比較嚴(yán)謹(jǐn)。
2)存儲(chǔ)過程的功能支持要比MySQL好,具備本地緩存執(zhí)行計(jì)劃的能力。
3)對(duì)表連接支持較完整,優(yōu)化器的功能較完整,支持的索引類型很多,復(fù)雜查詢能力較強(qiáng)。
4)PG主表采用堆表存放,MySQL采用索引組織表,能夠支持比MySQL更大的數(shù)據(jù)量。
5)PG的主備復(fù)制屬于物理復(fù)制,相對(duì)于MySQL基于binlog的邏輯復(fù)制,數(shù)據(jù)的一致性更加可靠,復(fù)制性能更高,對(duì)主機(jī)性能的影響也更小。
6)MySQL的存儲(chǔ)引擎插件化機(jī)制,存在鎖機(jī)制復(fù)雜影響并發(fā)的問題,而PG不存在。
7)PG對(duì)可以實(shí)現(xiàn)外部數(shù)據(jù)源查詢,數(shù)據(jù)源的支持類型豐富。
8)PG原生的邏輯復(fù)制可以實(shí)現(xiàn)表級(jí)別的訂閱發(fā)布,可以實(shí)現(xiàn)數(shù)據(jù)通過kafka流轉(zhuǎn),而不需要其他的組件。
9)PG支持三種表連接方式,嵌套循環(huán),哈希連接,排序合并,而MySQL只支持嵌套循環(huán)。
10)PostgreSQL源代碼寫的很清晰,易讀性比MySQL強(qiáng)太多了。
11)PostgreSQL通過PostGIS擴(kuò)展支持地理空間數(shù)據(jù)。地理空間數(shù)據(jù)有專用的類型和功能,可直接在數(shù)據(jù)庫級(jí)別使用,使開發(fā)人員更容易進(jìn)行分析和編碼。
12)可擴(kuò)展型系統(tǒng),有豐富可擴(kuò)展組件,作為contribute發(fā)布。
13)PostgreSQL支持JSON和其他NoSQL功能,如本機(jī)XML支持和使用HSTORE的鍵值對(duì)。它還支持索引JSON數(shù)據(jù)以加快訪問速度,特別是10版本JSONB更是強(qiáng)大。
14)PostgreSQL完全免費(fèi),而且是BSD協(xié)議,如果你把PostgreSQL改一改,然后再拿去賣錢,也沒有人管你,這一點(diǎn)很重要,這表明了PostgreSQL數(shù)據(jù)庫不會(huì)被其它公司控制。相反,MySQL現(xiàn)在主要是被Oracle公司控制。
2、MySQL相對(duì)于PG的優(yōu)勢(shì)
1)innodb的基于回滾段實(shí)現(xiàn)的MVCC機(jī)制,相對(duì)PG新老數(shù)據(jù)一起存放的基于XID的MVCC機(jī)制,是占優(yōu)的。新老數(shù)據(jù)一起存放,需要定時(shí)觸 發(fā)VACUUM,會(huì)帶來多余的IO和數(shù)據(jù)庫對(duì)象加鎖開銷,引起數(shù)據(jù)庫整體的并發(fā)能力下降。而且VACUUM清理不及時(shí),還可能會(huì)引發(fā)數(shù)據(jù)膨脹。
2)MySQL采用索引組織表,這種存儲(chǔ)方式非常適合基于主鍵匹配的查詢、刪改操作,但是對(duì)表結(jié)構(gòu)設(shè)計(jì)存在約束。
3)MySQL的優(yōu)化器較簡(jiǎn)單,系統(tǒng)表、運(yùn)算符、數(shù)據(jù)類型的實(shí)現(xiàn)都很精簡(jiǎn),非常適合簡(jiǎn)單的查詢操作。
4)MySQL相對(duì)于PG在國(guó)內(nèi)的流行度更高,PG在國(guó)內(nèi)顯得就有些落寞了。
5)MySQL的存儲(chǔ)引擎插件化機(jī)制,使得它的應(yīng)用場(chǎng)景更加廣泛,比如除了innodb適合事務(wù)處理場(chǎng)景外,myisam適合靜態(tài)數(shù)據(jù)的查詢場(chǎng)景。
總體上來說,開源數(shù)據(jù)庫都不是很完善,商業(yè)數(shù)據(jù)庫oracle在架構(gòu)和功能方面都還是完善很多的。從應(yīng)用場(chǎng)景來說,PG更加適合嚴(yán)格的企業(yè)應(yīng)用場(chǎng)景(比如金融、電信、ERP、CRM),但不僅僅限制于此,PostgreSQL的json,jsonb,hstore等數(shù)據(jù)格式,特別適用于一些大數(shù)據(jù)格式的分析;而MySQL更加適合業(yè)務(wù)邏輯相對(duì)簡(jiǎn)單、數(shù)據(jù)可靠性要求較低的互聯(lián)網(wǎng)場(chǎng)景(比如google、facebook、alibaba),當(dāng)然現(xiàn)在MySQL的在innodb引擎的大力發(fā)展,功能表現(xiàn)良好。
MySQL和PostgreSQL復(fù)雜的開源關(guān)系型數(shù)據(jù)庫,本文只是作者根據(jù)自己經(jīng)驗(yàn)寫的對(duì)PG和MySQL的理解,難免有不當(dāng)之處,不當(dāng)之處還請(qǐng)大家多多指正。
MySQL在國(guó)內(nèi)的發(fā)展已然很成熟,但是如果你轉(zhuǎn)向PostgreSQL,會(huì)發(fā)現(xiàn)不一樣的天地,學(xué)院派的風(fēng)格,豐富的功能,肯定會(huì)給你帶來不一樣的驚喜。
看完上述內(nèi)容,你們掌握PG和MySQL到底哪個(gè)更好用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。