PostgreSQL與MySQL比較


 

本帖最後由 osdba 於 2010-09-01 19:06 編輯

特性 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 參數來更新緩衝區緩存。
數據庫連接 客戶機使用 CONNECT 或 USE 語句連接數據庫,這時要指定數據庫名,還可以指定用戶 id 和密碼。使用角色管理數據庫中的用戶和用戶組。 客戶機使用 connect 語句連接數據庫,這時要指定數據庫名,還可以指定用戶 id 和密碼。使用角色管理數據庫中的用戶和用戶組。
身份驗證 MySQL 在數據庫級管理身份驗證。 基本只支持密碼認證 PostgreSQL 支持豐富的認證方法:信任認證、口令認證、Kerberos 認證、基於 Ident 的認證、LDAP 認證、PAM 認證
加密 可以在表級指定密碼來對數據進行加密。還可以使用 AES_ENCRYPT 和 AES_DECRYPT 函數對列數據進行加密和解密。可以通過 SSL 連接實現網絡加密。 可以使用 pgcrypto 庫中的函數對列進行加密/解密。可以通過 SSL 連接實現網絡加密。
審計 可以對 querylog 執行 grep。 可以在表上使用 PL/pgSQL 觸發器來進行審計。
查詢解釋 使用 EXPLAIN 命令查看查詢的解釋計劃。 使用 EXPLAIN 命令查看查詢的解釋計劃。
備份、恢復和日誌 InnoDB 使用寫前(write-ahead)日誌記錄。支持在線和離線完全備份以及崩潰和事務恢復。需要第三方軟件才能支持熱備份。 在數據目錄的一個子目錄中維護寫前日誌。支持在線和離線完全備份以及崩潰、時間點和事務恢復。 可以支持熱備份。
JDBC 驅動程序 可以從 參考資料 下載 JDBC 驅動程序。 可以從 參考資料 下載 JDBC 驅動程序。
表類型 取決於存儲引擎。例如,NDB 存儲引擎支持分區表,內存引擎支持內存表。 支持臨時表、常規表以及範圍和列表類型的分區表。不支持哈希分區表。 由於PostgreSQL的表分區是通過表繼承和規則系統完成了,所以可以實現更復雜的分區方式。
索引類型 取決於存儲引擎。MyISAM:BTREE,InnoDB:BTREE。 支持 B-樹、哈希、R-樹和 Gist 索引。
約束 支持主鍵、外鍵、惟一和非空約束。對檢查約束進行解析,但是不強制實施。 支持主鍵、外鍵、惟一、非空和檢查約束。
存儲過程和用戶定義函數 支持 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 在會話級進行設置。




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的主要劣勢在於:
   1、最新版本和歷史版本不分離存儲,導致清理老舊版本需要作更多的掃描,代價比較大,但一般的數據庫都有高峯期,如果我們合理安排VACUUM,這也不是很大的問題,而且在PostgreSQL9.0中VACUUM進一步被加強了。
  2、由於索引中完全沒有版本信息,不能實現Coverage index scan,即查詢只掃描索引,直接從索引中返回所需的屬性,還需要訪問表。而oracle與Innodb則可以;
  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中可以不必建專門的降序索引了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章