對Oracle 、SQL Server、MySQL、PostgreSQL數據庫優缺點分析

Oracle 、SQL Server、MySQL、PostgreSQL數據庫優缺點分析php

 

Oracle Database

Oracle Database,又名Oracle RDBMS,或簡稱Oracle。是甲骨文公司的一款關係數據庫管理系統。它是在數據庫領域一直處於領先地位的產品。能夠說Oracle數據庫系統是目前世界上流行的關係數據庫管理系統,系統可移植性好、使用方便、功能強,適用於各種大、中、小、微機環境。它是一種高效率、可靠性好的 適應高吞吐量的數據庫解決方案。python

 

優勢

1. Oracle 能在全部主流平臺上運行(包括 windows)徹底支持全部工業標準採用徹底開放策略使客戶選擇適合解決方案對開發商全力支持。
2. Oracle 並行服務器經過使組結點共享同簇工做來擴展windownt能力提供高用性和高伸縮性簇解決方案windowsNT能知足須要用戶把數據庫移UNIXOracle並行服務器對各類UNIX平臺集羣機制都有着至關高集成度。
3. 得到最高認證級別的ISO標準認證。  
4. Oracle 性能高 保持開放平臺下TPC-D和TPC-C世界記錄。
5. Oracle 多層次網絡計算支持多種工業標準用ODBC、JDBC、OCI等網絡客戶鏈接。
6. Oracle 長時間開發經驗徹底向下兼容得普遍應用地風險低。

缺點mysql


1. 對硬件的要求很高。
2. 價格比較昂貴。
3. 管理維護麻煩一些。
4. 操做比較複雜,須要技術含量較高。sql

 

SQL Server

SQL Server 是Microsoft 公司推出的關係型數據庫管理系統。具備使用方便可伸縮性好與相關軟件集成程度高等優勢,可跨越從運行Microsoft Windows 98 的膝上型電腦到運行Microsoft Windows 2012 的大型多處理器的服務器等多種平臺使用。數據庫

Microsoft SQL Server 是一個全面的數據庫平臺,使用集成商業智能 (BI)工具提供了企業級的數據管理。Microsoft SQL Server 數據庫引擎爲關係型數據和結構化數據提供了更安全可靠存儲功能,使您能夠構建和管理用於業務的高可用和高性能的數據應用程序編程

 

優勢windows


1. 易用性、適合分佈式組織的可伸縮性、用於決策支持的數據倉庫功能、與許多其餘服務器軟件緊密關聯的集成性、良好的性價比等;
2. 爲數據管理與分析帶來了靈活性,容許單位在快速變化的環境中從容響應,從而得到競爭優點。從數據管理和分析角度看,將原始數據轉化爲商業智能和充分利用Web帶來的機會很是重要。做爲一個完備的數據庫和數據分析包,SQLServer爲快速開發新一代企業級商業應用程序、爲企業贏得核心競爭優點打開了勝利之門。 做爲重要的基準測試可伸縮性和速度獎的記錄保持者,SQLServer是一個具有徹底Web支持的數據庫產品,提供了對可擴展標記語言 (XML)的核心支持以及在Internet上和防火牆外進行查詢的能力;

缺點瀏覽器


1. SQL Server 只能windows上運行,沒有絲毫開放性操做系統,系統穩定對數據庫十分重要,WindowsX系列產品偏重於桌面應用,NT server只適合小型企業,並且windows平臺可靠性、安全性和伸縮性很是有限。
2. SQL server 並行實施和共存模型併成熟難處理日益增多用戶數和數據卷伸縮性有限;緩存

3. 沒有得到任何安全證書。安全

4. SQL Server 多用戶時性能佳。

 

MySQL

MySQL 是一個關係型數據庫管理系統,由瑞典 MySQL AB 公司開發,目前屬於 Oracle 旗下公司。MySQL在 WEB 應用方面 MySQL 是最好的 RDBMS (Relational Database Management System,關係數據庫管理系統) 應用軟件之一。MySQL 是一種關聯數據庫管理系統, 關聯數據庫將數據保存在不一樣的表中,而不是將全部數據放在一個大倉庫內,這樣就增長了速度並提升了靈活性。MySQL 所使用的 SQL 語言是用於訪問數據庫的最經常使用標準化語言。其社區版的性能卓越,搭配 PHP 和 Apache 可組成良好的開發環境。

 

優勢


1. 體積小、速度快、整體擁有成本低,開源,提供的接口支持多種語言鏈接操做。

2. 支持多種操做系統。

3. MySQL 的核心程序採用徹底的多線程編程。線程是輕量級的進程,它能夠靈活地爲用戶提供服務,而不過多的系統資源。用多線程和C語言實現的MySQL 能很容易充分利用CPU。

4. MySQL 有一個很是靈活並且安全的權限和口令系統。當客戶與MySQL 服務器鏈接時,他們之間全部的口令傳送被加密,並且MySQL 支持主機認證。

5. MySQL 可以提供不少不一樣的使用者界面,包括命令行客戶端操做,網頁瀏覽器,以及各式各樣的程序語言界面,例如 C++,Perl,Java,PHP,以及Python。你可使用事先包裝好的客戶端,或者乾脆本身寫一個合適的應用程序。MySQL可用於 Unix,Windows,以及OS/2等平臺,所以它能夠用在我的電腦或者是服務器上。


缺點

 

1. 不支持熱備份。

2. MySQL不支持自定義數據類型

3. MySQL最大的缺點是其安全系統,主要是複雜而非標準,另外只有到調用mysqladmin來重讀用戶權限時才發生改變。

4. MySQL對存儲過程和觸發器支持不夠良好。

5. 儘管 MySQL 理論上還是開源產品,也有人抱怨它誕生以後更新緩慢。然而,應該注意到有一些基於 MySQL 並完整集成的數據庫(如 MariaDB),在標準的 MySQL 基礎上帶來了額外價值。

6. MySQL對XML支持不夠良好

什麼時候使用 ?

1. 分佈式操做:

當你須要的比SQLite能夠提供的更多時,把MySQL包括進你的部署棧,就像任何一個獨立的數據庫服務器,會帶來大量的操做自由和一些先進的功能。

2. 高安全性:

MySQL的安全功能,用一種簡單的方式爲數據訪問(和使用)提供了可靠的保護。

3. Web網站 和 Web應用:

絕大多數的網站(和Web應用程序)能夠忽視約束性地簡單工做在MySQL上。這種靈活的和可擴展的工具是易於使用和易於管理的——這被證實很是有助於長期運行。

4. 定製解決方案:

若是你工做在一個高度量身定製的解決方案上,MySQL可以很容易地尾隨和執行你的規則,這要感謝其豐富的配置設置和操做模式。

 

什麼時候不用 ?

1. SQL 服從性:

由於 MySQL 沒有[想要]實現 SQL 的所有標準,因此這個工具不徹底符合SQL。若是你須要對這樣的關係數據庫管理系統進行整合,從MySQL進行切換是不容易的。

2. 併發:

即便MySQL和一些存儲引擎可以真地很好執行讀取操做,但併發讀寫仍是有問題的。

3. 缺少特點:

再次說起,根據數據庫引擎的選擇標準,MySQL會缺少必定的特性,如全文搜索。

PostgreSQL

PostgreSQL是一個自由的對象-關係數據庫服務器(數據庫管理系統),支持大部分 SQL標準而且提供了許多其餘現代特性:複雜查詢、外鍵、觸發器、視圖、事務完整性、MVCC。一樣,PostgreSQL 能夠用許多方法擴展,好比, 經過增長新的數據類型、函數、操做符、彙集函數、索引。無償使用、修改、和分發 PostgreSQL。

優勢 

1. PostgreSQL 是一個開源的,免費的,同時很是強大的關係型數據管理系統。

2. PostgreSQL 背後有熱忱而經驗豐富的社區,能夠經過知識庫和問答網站獲取支持,全天候免費。

3. 即便其自己功能十分強大,PostgreSQL 仍附帶有許多強大的開源第三方工具來輔助系統的設計、管理和使用。

4. 能夠用預先存儲的流程來程序性擴展 PostgreSQL ,一個高級的關係型數據庫理應如此。

5. PostgreSQL 不僅是一個關係型數據庫,仍是一個面向對象數據庫——支持嵌套,及一些其餘功能。

缺點 

1. 對於簡單而繁重的讀取操做, 超過了 PostgreSQL 的殺傷力,可能會出現比同行(如MySQL)更低的性能。

2. 按給出的該工具的性質,從普及度來講它還缺少足夠後臺支撐,儘管有大量的部署——這可能會影響可以得到支持的容易程度。

 

什麼時候使用?

1. 數據完整性:

當可靠性和數據完整性是絕對必要而無需理由時,PostgreSQL是更好的選擇。

2. 複雜的自定義過程:

    若是你須要你的數據庫執行自定義過程,可擴展的PostgreSQL是更好的選擇。

3. 整合:

在未來,若是可能要把整個數據庫系統遷移到另外一個適當的解決方案(例如Oracle)中,PostgreSQL對於這種切換將是最兼容和易於操做的。

4. 複雜的設計:

相比其餘的開源和免費的 RDBMS(關係數據庫管理系統)實現來講,對於複雜的數據庫設計,PostgreSQL提供了大部分的功能和可能性,同時並沒放棄其餘有價值的地方。

 

什麼時候不用?

1. 速度:

若是你須要的只是快速的讀取操做, PostgreSQL 不是爲此而準備的工具。

2. 簡化體制:

除非你須要絕對的數據完整性,原子性,一致性,隔離性,耐久性,或複雜的設計,PostgreSQL 對簡化體制來講是殺手。

3. 複製:

除非你願意花很多時間,精力和資源,不然對於那些缺少數據庫和系統管理經驗的人來講,實現與MySQL的(主從)複製可能不容易。

 

 

摘:

 

爲了說明PostgreSQL的功能,我下面簡要對比一下PostgreSQL數據庫與MySQL數據庫之間的差別:

咱們先借助Jametong翻譯的"從Oracle遷移到Mysql以前必須知道的50件事",看一看如何把Oracle轉到MySQL中的困難:

50 things to know before migrating Oracle to MySQL

by Baron Schwartz,Translated by Jametong

1. 對子查詢的優化表現不佳.

2. 對複雜查詢的處理較弱

3. 查詢優化器不夠成熟

4. 性能優化工具與度量信息不足

5. 審計功能相對較弱

6. 安全功能不成熟,甚至能夠說很粗糙.沒有用戶組與角色的概念,沒有回收權限的功能(僅僅能夠授予權限).當一個用戶從不一樣的主機/網絡以一樣地用戶名/密碼登陸以後,可能被看成徹底不一樣的用戶來處理.沒有相似於Oracle的內置的加密功能.

7. 身份驗證功能是徹底內置的.不支持LDAP,Active Directory以及其它相似的外部身份驗證功能.

8. Mysql Cluster可能與你的想象有較大差別.

9. 存儲過程與觸發器的功能有限.

10. 垂直擴展性較弱.

11. 不支持MPP(大規模並行處理).

12. 支持SMP(對稱多處理器),可是若是每一個處理器超過4或8個核(core)時,Mysql的擴展性表現較差.

13. 對於時間、日期、間隔等時間類型沒有秒如下級別的存儲類型.

14. 可用來編寫存儲過程、觸發器、計劃事件以及存儲函數的語言功能較弱.

15. 沒有基於回滾(roll-back)的恢復功能,只有前滾(roll-forward)的恢復功能.

16. 不支持快照功能.

17. 不支持數據庫鏈(database link).有一種叫作Federated的存儲引擎能夠做爲一箇中轉將查詢語句傳遞到遠程服務器的一個表上,不過,它功能很粗糙而且漏洞不少.

18. 數據完整性檢查很是薄弱,即便是基本的完整性約束,也每每不能執行。

19. 優化查詢語句執行計劃的優化器提示很是少.

20. 只有一種錶鏈接類型:嵌套循環鏈接(nested-loop),不支持排序-合併鏈接(sort-merge join)與散列鏈接(hash join).

21. 大部分查詢只能使用表上的單一索引;在某些狀況下,會存在使用多個索引的查詢,可是查詢優化器一般會低估其成本,它們經常比表掃描還要慢.

22. 不支持位圖索引(bitmap index).每種存儲引擎都支持不一樣類型的索引.大部分存儲引擎都支持B-Tree索引.

23. 管理工具較少,功能也不夠成熟.

24. 沒有成熟可以使人滿意的IDE工具與調試程序.可能不得不在文本編輯器中編寫存儲過程,而且經過往表(調試日誌表)中插入記錄的方式來作調試.

25. 每一個表均可以使用一種不一樣的存儲引擎.

26. 每一個存儲引擎在行爲表現、特性以及功能上均可能有很大差別.

27. 大部分存儲引擎都不支持外鍵.

28. 默認的存儲引擎(MyISAM)不支持事務,而且很容易損壞.

29. 最早進最流行的存儲引擎InnoDB由Oracle擁有.

30. 有些執行計劃只支持特定的存儲引擎.特定類型的Count查詢,在這種存儲引擎中執行很快,在另一種存儲引擎中可能會很慢.

31. 執行計劃並非全局共享的,,僅僅在鏈接內部是共享的.

32. 全文搜索功能有限, 只適用於非事務性存儲引擎. Ditto用於地理信息系統/空間類型和查詢.

33. 沒有資源控制.一個徹底未經受權的用戶能夠絕不費力地耗盡服務器的全部內存並使其崩潰,或者能夠耗盡全部CPU資源.

34. 沒有集成商業智能(business intelligence), OLAP **數據集等軟件包.

35. 沒有與Grid Control相似的工具( http://solutions.mysql.com/go.php?id=1296&t=s )

36. 沒有相似於RAC的功能.若是你問」如何使用Mysql來構造RAC」,只能說你問錯了問題.

37. 不支持用戶自定義類型或域(domain).

38. 每一個查詢支持的鏈接的數量最大爲61.

39. MySQL支持的SQL語法(ANSI SQL標準)的很小一部分.不支持遞歸查詢、通用表表達式(Oracle的with 語句)或者窗口函數(分析函數).支持部分相似於Merge或者相似特性的SQL語法擴展,不過相對於Oracle來說功能很是簡單.

40. 不支持功能列(基於計算或者表達式的列,Oracle11g 開始支持計算列,以及早期版本就支持虛列(rownum,rowid)).

41. 不支持函數索引,只能在建立基於具體列的索引.

42. 不支持物化視圖.

43. 不一樣的存儲引擎之間,統計信息差異很大,而且全部的存儲引擎支持的統計信息都只支持簡單的基數(cardinality)與必定範圍內的記錄數(rows-in-a-range). 換句話說,數據分佈統計信息是有限的.更新統計信息的機制也很少.

44. 沒有內置的負載均衡與故障切換機制.

45. 複製(Replication)功能是異步的,而且有很大的侷限性.例如,它是單線程的(single-threaded),所以一個處理能力更強的Slave的恢復速度也很難跟上處理能力相對較慢的Master.

46. Cluster並不如想象的那麼完美.或許我已經提過這一點,可是這一點值得再說一遍.

47. 數據字典(INFORMATION_SCHEMA)功能頗有限,而且訪問速度很慢(在繁忙的系統上還很容易發生崩潰).

48. 不支持在線的Alter Table操做.

49. 不支持Sequence.

50. 相似於ALTER TABLE或CREATE TABLE一類的操做都是非事務性的.它們會提交未提交的事務,而且不能回滾也不能作災難恢復.Schame被保存在文件系統上,這一點與它使用的存儲引擎無關.

 

 

MySQL Vs PostgreSQL

 

特性

MySQL

PostgreSQL

實例 

經過執行 MySQL 命令(mysqld)啓動實例。一個實例能夠管理一個或多個數據庫。一臺服務器能夠運行多個 mysqld 實例。一個實例管理器能夠監視 mysqld 的各個實例。 


經過執行 Postmaster 進程(pg_ctl)啓動實例。一個實例能夠管理一個或多個數據庫,這些數據庫組成一個集羣。集羣是磁盤上的一個區域,這個區域在安裝時初始化並由一個目 錄組成,全部數據都存儲在這個目錄中。使用 initdb 建立第一個數據庫。一臺機器上能夠啓動多個實例。 

數據庫 

數據庫是命名的對象集合,是與實例中的其餘數據庫分離的實體。一個 MySQL 實例中的全部數據庫共享同一個系統編目。 

數據庫是命名的對象集合,每一個數據庫是與其餘數據庫分離的實體。每一個數據庫有本身的系統編目,可是全部數據庫共享 pg_databases。 

數據緩衝區 

經過 innodb_buffer_pool_size 配置參數設置數據緩衝區。這個參數是內存緩衝區的字節數,InnoDB 使用這個緩衝區來緩存表的數據和索引。在專用的數據庫服務器上,這個參數最高能夠設置爲機器物理內存量的 80%。 

Shared_buffers 緩存。在默認狀況下分配 64 個緩衝區。默認的塊大小是 8K。能夠經過設置 postgresql.conf 文件中的 shared_buffers 參數來更新緩衝區緩存。 

身份驗證 

MySQL 在數據庫級管理身份驗證。 基本只支持密碼認證。

PostgreSQL 支持豐富的認證方法:信任認證、口令認證、Kerberos 認證、基於 Ident 的認證、LDAP 認證、PAM 認證

加密 

能夠在表級指定密碼來對數據進行加密。還可使用 AES_ENCRYPT 和 AES_DECRYPT 函數對列數據進行加密和解密。能夠經過 SSL 鏈接實現網絡加密。 

可使用 pgcrypto 庫中的函數對列進行加密/解密。能夠經過 SSL 鏈接實現網絡加密。 

審計 

能夠對 querylog 執行 grep。 

能夠在表上使用 PL/pgSQL 觸發器來進行審計。 

查詢解釋 

使用 EXPLAIN 命令查看查詢的解釋計劃。 

使用 EXPLAIN 命令查看查詢的解釋計劃。 

備份、恢復和日誌

InnoDB 使用寫前(write-ahead)日誌記錄。支持在線和離線徹底備份以及崩潰和事務恢復。須要第三方軟件才能支持熱備份。

在數據目錄的一個子目錄中維護寫前日誌。支持在線和離線徹底備份以及崩潰、時間點和事務恢復。 能夠支持熱備份。

表類型 

取決於存儲引擎。例如,NDB 存儲引擎支持分區表,內存引擎支持內存表。 

支持臨時表、常規表以及範圍和列表類型的分區表。不支持哈希分區表。 因爲PostgreSQL的表分區是經過表繼承和規則系統完成了,因此能夠實現更復雜的分區方式。

索引類型 

取決於存儲引擎。MyISAM:BTREE,InnoDB:BTREE。 

支持 B-樹、哈希、R-樹和 Gist 索引。 

約束 

支持主鍵、外鍵、唯一和非空約束。對檢查約束進行解析,可是不強制實施。 

支持主鍵、外鍵、唯1、非空和檢查約束。 

存儲過程和用戶定義函數 

支持 CREATE PROCEDURE 和 CREATE FUNCTION 語句。存儲過程能夠用 SQL 和 C++ 編寫。用戶定義函數能夠用 SQL、C 和 C++ 編寫。 

沒有單獨的存儲過程,都是經過函數實現的。用戶定義函數能夠用 PL/pgSQL(專用的過程語言)、PL/Tcl、PL/Perl、PL/Python 、SQL 和 C 編寫。 

觸發器 

支持行前觸發器、行後觸發器和語句觸發器,觸發器語句用過程語言複合語句編寫。 

支持行前觸發器、行後觸發器和語句觸發器,觸發器過程用 C 編寫。 

系統配置文件 

my.conf 

Postgresql.conf 

數據庫配置 

my.conf 

Postgresql.conf 

客戶機鏈接文件 

my.conf 

pg_hba.conf 

XML 支持 

有限的 XML 支持。 

有限的 XML 支持。 

數據訪問和管理服務器 

OPTIMIZE TABLE —— 回收未使用的空間並消除數據文件的碎片
myisamchk -analyze —— 更新查詢優化器所使用的統計數據(MyISAM 存儲引擎)
mysql —— 命令行工具
MySQL Administrator —— 客戶機 GUI 工具 

Vacuum —— 回收未使用的空間
Analyze —— 更新查詢優化器所使用的統計數據
psql —— 命令行工具
pgAdmin —— 客戶機 GUI 工具 

併發控制 

支 持表級和行級鎖。InnoDB 存儲引擎支持 READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ 和 SERIALIZABLE。使用 SET TRANSACTION ISOLATION LEVEL 語句在事務級設置隔離級別。 

支 持表級和行級鎖。支持的 ANSI 隔離級別是 Read Committed(默認 —— 能看到查詢啓動時數據庫的快照)和 Serialization(與 Repeatable Read 類似 —— 只能看到在事務啓動以前提交的結果)。使用 SET TRANSACTION 語句在事務級設置隔離級別。使用 SET SESSION 在會話級進行設置。

MySQL相對於PostgreSQL的劣勢:

MySQL

PostgreSQL

最重要的引擎InnoDB很早就由Oracle公司控制。目前整個MySQL數據庫都由Oracle控制。

BSD協議,沒有被大公司壟斷。

對複雜查詢的處理較弱,查詢優化器不夠成熟

很強大的查詢優化器,支持很複雜的查詢處理。

只有一種錶鏈接類型:嵌套循環鏈接(nested-loop),不支持排序-合併鏈接(sort-merge join)與散列鏈接(hash join)。

都支持

性能優化工具與度量信息不足

提供了一些性能視圖,能夠方便的看到發生在一個表和索引上的select、delete、update、insert統計信息,也能夠看到cache命中率。網上有一個開源的pgstatspack工具。

InnoDB的表和索引都是按相同的方式存儲。也就是說表都是索引組織表。這通常要求主鍵不能太長並且插入時的主鍵最好是按順序遞增,不然對性能有很大影響。

不存在這個問題。

大部分查詢只能使用表上的單一索引;在某些狀況下,會存在使用多個索引的查詢,可是查詢優化器一般會低估其成本,它們經常比表掃描還要慢。

不存在這個問題

表增長列,基本上是重建表和索引,會花很長時間。

表增長列,只是在數據字典中增長表定義,不會重建表

存儲過程與觸發器的功能有限。可用來編寫存儲過程、觸發器、計劃事件以及存儲函數的語言功能較弱

除支持pl/pgsql寫存儲過程,還支持perl、python、Tcl類型的存儲過程:pl/perl,pl/python,pl/tcl。

也支持用C語言寫存儲過程。

不支持Sequence。

支持

不支持函數索引,只能在建立基於具體列的索引。

不支持物化視圖。

 

支持函數索引,同時還支持部分數據索引,經過規則系統能夠實現物化視圖的功能。

執行計劃並非全局共享的, 僅僅在鏈接內部是共享的。

執行計劃共享

MySQL支持的SQL語法(ANSI SQL標準)的很小一部分。不支持遞歸查詢、通用表表達式(Oracle的with 語句)或者窗口函數(分析函數)。

都 支持

 

不支持用戶自定義類型或域(domain)

支持。

對於時間、日期、間隔等時間類型沒有秒如下級別的存儲類型

能夠精確到秒如下。

身份驗證功能是徹底內置的,不支持操做系統認證、PAM認證,不支持LDAP以及其它相似的外部身份驗證功能。

支持OS認證、Kerberos 認證 、Ident 的認證、LDAP 認證、PAM 認證

不支持database link。有一種叫作Federated的存儲引擎能夠做爲一箇中轉將查詢語句傳遞到遠程服務器的一個表上,不過,它功能很粗糙而且漏洞不少

dblink,同時還有一個dbi-link的東西,能夠鏈接到oracle和mysql上。

Mysql Cluster可能與你的想象有較大差別。開源的cluster軟件較少。

複製(Replication)功能是異步的,而且有很大的侷限性.例如,它是單線程的(single-threaded),所以一個處理能力更強的Slave的恢復速度也很難跟上處理能力相對較慢的Master.

有豐富的開源cluster軟件支持。

explain看執行計劃的結果簡單。

explain返回豐富的信息。

相似於ALTER TABLE或CREATE TABLE一類的操做都是非事務性的.它們會提交未提交的事務,而且不能回滾也不能作災難恢復

DDL也是有事務的。

 



PostgreSQL主要優點:
  1. PostgreSQL徹底免費,並且是BSD協議,若是你把PostgreSQL改一改,而後再拿去賣錢,也沒有人管你,這一點很重要,這代表了 PostgreSQL數據庫不會被其它公司控制。oracle數據庫不用說了,是商業數據庫,不開放。而MySQL數據庫雖然是開源的,但如今隨着SUN 被oracle公司收購,如今基本上被oracle公司控制,其實在SUN被收購以前,MySQL中最重要的InnoDB引擎也是被oracle公司控制 的,而在MySQL中不少重要的數據都是放在InnoDB引擎中的,反正咱們公司都是這樣的。因此若是MySQL的市場範圍與oracle數據庫的市場範 圍衝突時,oracle公司一定會犧牲MySQL,這是毫無疑問的。 
  2. 與PostgreSQl配合的開源軟件不少,有不少分佈式集羣軟件,如pgpool、pgcluster、slony、plploxy等等,很容易作讀寫分離、負載均衡、數據水平拆分等方案,而這在MySQL下則比較困難。
      3. PostgreSQL源代碼寫的很清晰,易讀性比MySQL強太多了,懷疑MySQL的源代碼被混淆過。因此不少公司都是基本PostgreSQL作二次開發的。
      4. PostgreSQL在不少方面都比MySQL強,如複雜SQL的執行、存儲過程、觸發器、索引。同時PostgreSQL是多進程的,而MySQL是線 程的,雖然併發不高時,MySQL處理速度快,但當併發高的時候,對於如今多核的單臺機器上,MySQL的整體處理性能不如PostgreSQL,緣由是 MySQL的線程沒法充分利用CPU的能力。
     目前只想到這些,之後想到再添加,歡迎你們拍磚。


PostgreSQL與oracle或InnoDB的多版本實現的差異

PostgreSQL與oracle或InnoDB的多版本實現最大的區別在於最新版本和歷史版本是否分離存儲,PostgreSQL不分,而oracle和InnoDB分,而innodb也只是分離了數據,索引自己沒有分開。
   PostgreSQL的主要優點在於:
   1. PostgreSQL沒有回滾段,而oracle與innodb有回滾段,oracle與Innodb都有回滾段。對於oracle與Innodb來講, 回滾段是很是重要的,回滾段損壞,會致使數據丟失,甚至數據庫沒法啓動的嚴重問題。另因爲PostgreSQL沒有回滾段,舊數據都是記錄在原先的文件 中,因此當數據庫異常crash後,恢復時,不會象oracle與Innodb數據庫那樣進行那麼複雜的恢復,由於oracle與Innodb恢復時同步 須要redo和undo。因此PostgreSQL數據庫在出現異常crash後,數據庫起不來的概率要比oracle和mysql小一些。
   2. 因爲舊的數據是直接記錄在數據文件中,而不是回滾段中,因此不會象oracle那樣常常報ora-01555錯誤。
   3. 回滾能夠很快完成,由於回滾並不刪除數據,而oracle與Innodb,回滾時很複雜,在事務回滾時必須清理該事務所進行的修改,插入的記錄要刪除,更 新的記錄要更新回來(見row_undo函數),同時回滾的過程也會再次產生大量的redo日誌。
   4. WAL日誌要比oracle和Innodb簡單,對於oracle不只須要記錄數據文件的變化,還要記錄回滾段的變化。
   PostgreSQL的多版本的主要劣勢在於:
   一、最新版本和歷史版本不分離存儲,致使清理老舊版本須要做更多的掃描,代價比較大,但通常的數據庫都有高峯期,若是咱們合理安排VACUUM,這也不是很大的問題,並且在PostgreSQL9.0中VACUUM進一步被增強了。
  二、因爲索引中徹底沒有版本信息,不能實現Coverage index scan,即查詢只掃描索引,直接從索引中返回所需的屬性,還須要訪問表。而oracle與Innodb則能夠;


進程模式與線程模式的對比
PostgreSQL和oracle是進程模式,MySQL是線程模式。
進程模式對多CPU利用率比較高。
進程模式共享數據須要用到共享內存,而線程模式數據自己就是在進程空間內都是共享的,不一樣線程訪問只須要控制好線程之間的同步。
線程模式對資源消耗比較少。
因此MySQL能支持遠比oracle多的更多的鏈接。
對於PostgreSQL的來講,若是不使用鏈接池軟件,也存在這個問題,但PostgreSQL中有優秀的鏈接池軟件軟件,如pgbouncer和pgpool,因此經過鏈接池也能夠支持不少的鏈接。

堆表與索引組織表的的對比

Oracle支持堆表,也支持索引組織表
PostgreSQL只支持堆表,不支持索引組織表
Innodb只支持索引組織表
索引組織表的優點:
表內的數據就是按索引的方式組織,數據是有序的,若是數據都是按主鍵來訪問,那麼訪問數據比較快。而堆表,按主鍵訪問數據時,是須要先按主鍵索引找到數據的物理位置。
索引組織表的劣勢:
索引組織表中上再加其它的索引時,其它的索引記錄的數據位置再也不是物理位置,而是主鍵值,因此對於索引組織表來講,主鍵的值不能太大,不然佔用的空間比較大。
對於索引組織表來講,若是每次在中間插入數據,可能會致使索引分裂,索引分裂會大大下降插入的性能。因此對於使用innodb來講,咱們通常最好讓主鍵是一個無心義的序列,這樣插入每次都發生在最後,以免這個問題。
因爲索引組織表是按一個索引樹,通常它訪問數據塊必須按數據塊之間的關係進行訪問,而不是按物理塊的訪問數據的,因此當作全表掃描時要比堆錶慢不少,這可能在OLTP中不明顯,但在數據倉庫的應用中多是一個問題。


PostgreSQL9.0中的特點功能:   
PostgreSQL中的Hot Standby功能
    也就是standby在應用日誌同步時,還能夠提供只讀服務,這對作讀寫分離頗有用。這個功能是oracle11g纔有的功能。

PostgreSQL異步提交(Asynchronous Commit)的功能:
  這個功能oracle中也是到oracle11g R2纔有的功能。由於在不少應用場景中,當宕機時是容許丟失少許數據的,這個功能在這樣的場景中就特別合適。在PostgreSQL9.0中把 synchronous_commit設置爲false就打開了這個功能。須要注意的是,雖然設置爲了異步提交,當主機宕機時,PostgreSQL只會 丟失少許數據,異步提交併不會致使數據損壞而數據庫起不來的狀況。MySQL中沒有據說過有這個功能。

PostgreSQL中索引的特點功能:
   PostgreSQL中能夠有部分索引,也就是隻能表中的部分數據作索引,create index 能夠帶where 條件。同時PostgreSQL中的索引能夠反向掃描,因此在PostgreSQL中能夠沒必要建專門的降序索引了。

引用自  http://blog.csdn.net/ranran_5300/article/details/48129187

相關文章
相關標籤/搜索