都屬於開放源碼的一員,性能和功能都在高速地提高和增強。MySQL AB的人們和PostgreSQL的開發者們都在盡可能地把各自的數據庫改得越來越好,所以對於任何商業數據庫使用其中的任何一個都不能算是錯誤的選擇。
PostgreSQL : 免費
原則: 對於一個數據庫,穩定性和速度並不能代表一切。對於一個成熟的數據庫,穩定性肯定會日益提供。而隨着硬件性能的飛速提高,速度也不再是什么太大的問題。
1 架構對比
MySQL: 多線程
PostgreSQL: 多進程
多線程架構和多進程架構之間沒有絕對的好壞,例如oracle在unix上是多進程架構,在windows上是多線程架構。
PG 的有多種集群架構可以選擇,plproxy 可以支持語句級的鏡像或分片,slony 可以進行字段級的同步設置,standby 可以構建WAL文件級或流式的讀寫分離集群,同步頻率和集群策略調整方便,操作非常簡單。
pgsql對於numa架構的支持比mysql強一些,比MYSQL對於讀的性能更好一些,pgsql提交可以完全異步,而mysql的內存表不夠實用(因為表鎖的原因)
2 對存儲過程[1]及事務的支持能力
1) MySQL對於無事務的MyISAM表,采用表鎖定,一個長時間運行的查詢很可能會長時間地阻礙對表的更新,而PostgreSQL不存在這樣的問題。
2) PostgreSQL支持存儲過程,要比MySQL好,具備本地緩存執行計划的能力;
3) MySQL 4.0.2-alpha開始支持事務的概念,保留無事務的表類型, 為用戶提供了更多的選擇。
3 穩定性及性能
1)高並發讀寫,負載逼近極限下,PG的性能指標仍可以維持雙曲線甚至對數曲線,到頂峰之后不再下降,而 MySQL 明顯出現一個波峰后下滑(5.5版本之后,在企業級版本中有個插件可以改善很多,不過需要付費)
2) PostgreSQL 的穩定性極強, Innodb 等引擎在崩潰、斷電之類的災難場景下抗打擊能力有了長足進步,然而很多 MySQL 用戶都遇到過Server級的數據庫丟失的場景——mysql系統庫是MyISAM的,相比之下,PG數據庫這方面要好一些。
3) mysql的innodb引擎,可以充分優化利用系統所有內存,超大內存下PG對內存使用的不那么充分(需要根據內存情況合理配置)。從測試結果上看,mysql 5.5的性能提升很大,單機性能強於pgsql,5.6應該會強更多。
4 高可用性
MySQL可以適應24/7運行。在絕大多數情況下,你不需要為MySQL運行任何清除程序。PostgreSQL目前仍不完全適應24/7運行,這是因為你必須每隔一段時間運行一次VACUUM。
innodb的基於回滾段實現的MVCC機制,相對PG新老數據一起存放的基於XID的MVCC機制,是占優的。新老數據一起存放,需要定時觸 發VACUUM,會帶來多余的IO和數據庫對象加鎖開銷,引起數據庫整體的並發能力下降。而且VACUUM清理不及時,還可能會引發數據膨脹;
5 數據同步方式:
1)mysql到現在也是異步復制,pgsql可以做到同步,異步,半同步復制。
2) mysql的同步是基於binlog復制,類似oracle golden gate,是基於stream的復制,做到同步很困難,這種方式更加適合異地復制;pgsql的復制基於wal,可以做到同步復制。同時,pgsql還提供stream復制。
3) MySQL的復制可以用多級從庫,但是在9.2之前,PGSQL不能用從庫帶從庫。
4) PG的主備復制屬於物理復制,相對於MySQL基於binlog的邏輯復制,數據的一致性更加可靠,復制性能更高,對主機性能的影響也更小。
7 權限控制對比
MySQL允許你定義一整套的不同的數據級、表級和列級的權限,允許你指定基於主機的權限;
MySQL的MERGE表提供了一個獨特管理多個表的方法。myisampack可以對只讀表進行壓縮,此后仍然可以直接訪問該表中的行。
7 SQL語句支持能力
1)PG有極其強悍的 SQL 編程能力(9.x 圖靈完備,支持遞歸!),有非常豐富的統計函數和統計語法支持,比如分析函數(ORACLE的叫法,PG里叫window函數);
2)支持用多種語言來寫存儲過程,對於R的支持也很好。這一點上MYSQL就差的很遠,很多分析功能都不支持。騰訊內部數據存儲主要是MYSQL,但是數據分析主要是HADOOP+PGSQL(聽李元佳說過,但是沒有驗證過)。
3)pgsql對表名大小的處理,只有在SQL語句中,表名加雙引號,才區分大小寫。
4)在SQL的標准實現上要比MySQL完善,而且功能實現比較嚴謹;
5)對表連接支持較完整,優化器的功能較完整,支持的索引類型很多,復雜查詢能力較強;
6)MySQL采用索引組織表,這種存儲方式非常適合基於主鍵匹配的查詢、刪改操作,但是對表結構設計存在約束;
7)MySQL的Join操作的性能非常的差,只支持Nest Join,所以一旦數據量大,性能就非常的差。PostgreSQL除了支持nest join外,還支持hash join和 sort merge join;PostgreSQL支持正則表達式查找,MySQL不支持;
8 數據類型支持能力
PostgreSQL可以更方便地使用UDF(用戶定義函數)進行擴展。
1) 有豐富的幾何類型,實際上不止幾何類型,PG有大量字典、數組、bitmap 等數據類型, 因此PG 多年來在 GIS 領域處於優勢地位。相比之下mysql就差很多,instagram就是因為PG的空間數據庫擴展POSTGIS遠遠強於MYSQL的my spatial而采用PGSQL的。MYSQL中的空間數據類型有4種,分別是GEOMETRY、POINT、LINESTRING、POLYGON,其空間索引只能在存儲引擎為MYISAM的表中創建,用SPATIAL關鍵字進行擴展,使得能夠用於創建正規索引類型的語法創建空間索引。創建空間索引的列,必須將其聲明為NOT NULL。不同的存儲引擎有差別。MyISAM和InnoDB都支持spatial extensions,但差別在於:如果使用MyISAM,可以建立spatial index,而InnoDB是不支持的。
2) pgsql對json支持比較好,還有很逆天的fdw[2]功能,就是把別的數據庫的表當自己的用;
3) pgsql的字段類型支持的多,有很多mysql沒有的類型,但是實際中有時候用到。
4) 一般關系型數據庫的字符串有限定長度8k左右,無限長 TEXT 類型的功能受限,只能作為外部大數據訪問。而 PG 的 TEXT 類型可以直接訪問,SQL語法內置正則表達式,可以索引,還可以全文檢索,或使用xml xpath。用PG的話,文檔數據庫都可以省了。
5) postgresql有grouping sets函數,也是迫使我拋棄mysql第一原因。做報表后台計算,olap/oltp之類的這個函數簡直是剛性需求。沒有grouping sets函數,我感覺做報表后台計算,簡直慘不忍睹。當然pgsql還有挺多很好用的窗口函數之類,用起來真心爽。mysql做數據報表計算后台最大缺點就是沒有grouping sets和一些窗口函數,替代方案很麻煩而且效率低,做很多統計數據各種表連接、外連接等等一大堆,不同數據庫之間數據的利用計算。
8) PG支持R-trees這樣可擴展的索引類型,可以更方便地處理一些特殊數據。
9)PG可以使用函數和條件索引,使得數據庫的調優非常靈活,mysql就沒有這個功能,條件索引在web應用中很重要。
9 入庫過程容錯能力
大批量數據入庫,PostgresSQL要求所有數據必須完全滿足要求,有一條錯誤,整個數據入庫過程失敗;MySQL無此問題。比如,每天1000萬行數據,就因為一條打印的不完整,PostgreSQL會直接報錯,導致一條也導入不進去。1000萬里面有一行將數字類型的等級打印成了字符串的東西,那么pgsql會非讓你找出這一條刪掉,然后才能將剩下的數據導入進去。mysql就完全沒有這個問題,比如mysql level字段定義的int類型,幾千萬中有一條數據沒注意打印成字符串,mysql會自己給你轉成0存儲的,不會有任何報錯。
10 表組織方式
1) pgsql用繼承的方法實現分區表,讓分區表的使用不方便且性能差,這點比不上mysql。
2) PG主表采用堆表存放,MySQL采用索引組織表,能夠支持比MySQL更大的數據量;
3) MySQL分區表的實現要優於PG的基於繼承表的分區實現,主要體現在分區個數達到上千上萬后的處理性能差異較大。
11 開發接口
對於web應用來說,mysql 5.6 的內置MC API功能很好用,PGSQL差一些。
PG 的“無鎖定”特性非常突出,甚至包括 vacuum 這樣的整理數據空間的操作,這個和PGSQL的MVCC實現有關系。
12 維護團隊
MySQL的背后是一個成熟的商業公司,使得MySQL的開發過程更為慎重;
PostgreSQL的背后是一個龐大的志願開發組, PostgreSQL的反應更為迅速。這樣的兩種背景直接導致了各自固有的優點和缺點。