概述
在幾個流行的數據庫中,我首先接觸到的是MySQL,隨著工作發展,接觸到越來越多的是PostgreSQL數據庫。這兩個十分流行的開源數據庫。在這之后,我就會經常和一些朋友進行討論:MySQL和PostgreSQL兩者之間到底有什么異同點呢?
翻閱資料,今天就來學習一下
ACID的遵從性(ACID Compliance )對比
數據庫是否滿足事物的四大特性是判斷數據庫優劣的重要標準之一
PostgreSQL:
完全遵從ACID,確保滿足所有ACID的需求
MySQL:
只有InnoDB等少量存儲引擎遵從ACID,所以客戶選取就更加靈活
原子性(Atomic)
Atomic是指事務包含的所有操作要么全部成功,要么全部失敗回滾
PostgreSQL是全面支持事務的關系型數據庫,不僅DML語句可以在一個事務中,DDL語句也支持事務,即可以把創建多張表時的DDL語句放到一個事務中,這樣可以保證這些表要不都創建成功,要不都不成功。
而MySQL無法把多條DDL語句放到一個事務中。PostgreSQL能保證多條DDL的原子性,這是PG的亮點。
一致性(Consistency)
Consistency是指事務必須使數據庫從一個一致性的狀態變到另外一個一致的狀態,也就是執行事務之前和之后的狀態都必須處于一致的狀態。一致性:例如數據庫完整性約束正確;日志狀態一致; 索引和數據的一致, 即事務完成后,數據庫的一切都是對的。
而兩者的約束對比如下
隔離性(Isolcation)
Isolcation是指并發執行多個事務時,使它們各自好像是系統在給定時間內執行的唯一操作,即每一事務在系統中認為只有該事務在使用系統,不受其它事務干擾。
達到的效果: 對于任意兩個并發的事務T1和T2,在事務T1看來,T2要么在T1開始之前就已經結束,要么在T1結束之后才開始,這樣每個事務都感覺不到有其他事務在并發地執行。
幾種隔離級別的性能比較
而PostgreSQL和MySQL的隔離性差異如下
MySQL和PostgreSQL都實現了基于快照的事務隔離級別,即snapshot isolation,PostgreSQL還實現了可串行化的快照隔離級別,即SSI。
持久性(Durability)
Durability是指一個事務一旦被提交了,那么對于數據庫中的數據改變就是永久性的,即便是在數據庫系統遭遇到故障的情況下也不會丟失提交事務的操作。
早期的MySQL版本中的默認配置不是提交后立即持久化的,即提交后,數據可能丟失(追求性能),PostgreSQL一開始默認就是持久化的,當然也可以設置成非立即持久化。
對SQL標準的支持度對比
PostgreSQL:
遵從SQL標準支持最好的數據庫。SQL2011標準中,179個核心特性(mandatory features ),做到至少160個,也支持了很多附加特性
MySQL:
只有部分支持,基本是只持了SQL 92標準的部分
支持的業務場景對比
PostgreSQL:
既支持OLTP場景也支持OLAP場景,混合性業務場景,類似Oracle數據庫。能很好的支持JSON文檔型業務場景。金融級的可靠性,設計目標是以穩定性和可靠性為第一目標,支持大數據庫,可以可靠支持幾十T的大數據庫
MySQL:
只支持OLTP場景,不可用于OLAP場景
mysql5.7以后才對JSON的有了支持
簡單和性能是設計第一目標,支持可靠性很高的業務存在一定的困難
大數據庫支持存在一定的困難,需要做單機多實例
復制功能對比
復制類型的支持
PostgreSQL支持以下類型:
- 單主到單備
- 單主到多備
- 物理備庫可以讀
- 雙向復雜
- 邏輯的流復制(發布和訂閱模式)
- 級聯的復制
- 全同步、半同步、異步
- 同步復制中支持最少同步到幾個備節點,即保證至少寫幾份數據
MySQL支持以下類型:
- 單主到單備
- 單主到多備
- 單主到單個備再到單個或多個備
- 循環復制:A->B->C->A
- 雙主復制
- 異步復制和半同步復制
主要功能對比
查詢相關功能對比
表的功能支持
架構功能對比
視圖表功能對比
加密使用功能對比
后記
總之,PostgreSQL和MySQL是從底層設計原理開始就不一樣的兩種數據庫,在數據量小的時候,數據庫更趨于輕量化,MySQL會更適合。但是一旦數據量稍漲,計算量上升,PostgreSQL會是更好的選擇。