區別:1、mysql通過執行命令啟動實例,而PG通過執行進程來啟動;2、PG支持物化視圖、而MySQL不支持物化視圖;3、MySQL不支持拓展性,而PG是高度可擴展的;4、PG存儲過程的功能支持要比MySQL好,具備本地緩存執行計劃的能力。
本教程操作環境:windows7系統、mysql8版本、Dell G3電腦。
MySQL
MySQL相對來說比較年輕,首度出現在1994年。它聲稱自己是最流行的開源數據庫。MySQL就是LAMP(用于Web開發的軟件包,包括 linux、apache及perl/php/python)中的M。構建在LAMP棧之上的大多數應用都會使用MySQL,包括那些知名的應用,如 WordPress、Drupal、Zend及phpBB等。
一開始,MySQL的設計目標是成為一個快速的Web服務器后端,使用快速的索引序列訪問方法(ISAM),不支持ACID。經過早期快速的發展之 后,MySQL開始支持更多的存儲引擎,并通過InnoDB引擎實現了ACID。MySQL還支持其他存儲引擎,提供了臨時表的功能(使用MEMORY存 儲引擎),通過MyISAM引擎實現了高速讀的數據庫,此外還有其他的核心存儲引擎與第三方引擎。
MySQL的文檔非常豐富,有很多質量不錯的免費參考手冊、圖書與在線文檔,還有來自于oracle和第三方廠商的培訓與支持。
MySQL近幾年經歷了所有權的變更和一些頗具戲劇性的事件。它最初是由MySQL AB開發的,然后在2008年以10億美金的價格賣給了Sun公司,Sun公司又在2010年被Oracle收購。Oracle支持MySQL的多個版 本:Standard、Enterprise、Classic、Cluster、Embedded與Community。其中有一些是免費下載的,另外一 些則是收費的。其核心代碼基于GPL許可,對于那些不想使用GPL許可的開發者與廠商來說還有商業許可可供使用。
現在,基于最初的MySQL代碼還有更多的數據庫可供選擇,因為幾個核心的MySQL開發者已經發布了MySQL分支。最初的MySQL創建者之一 Michael “Monty” Widenius貌似后悔將MySQL賣給了Sun公司,于是又開發了他自己的MySQL分支mariadb,它是免費的,基于GPL許可。知名的 MySQL開發者Brian Aker所創建的分支Drizzle對其進行了大量的改寫,特別針對多CPU、云、網絡應用與高并發進行了優化。
PostgreSQL(簡稱PG)標榜自己是世界上最先進的開源數據庫。PostgreSQL的一些粉絲說它能與Oracle相媲美,而且沒有那么昂貴的價格和傲慢的客服。它擁有很長的歷史,最初是1985年在加利福尼亞大學伯克利分校開發的,作為Ingres數據庫的后繼。
PostgreSQL是完全由社區驅動的開源項目,由全世界超過1000名貢獻者所維護。它提供了單個完整功能的版本,而不像MySQL那樣提供了 多個不同的社區版、商業版與企業版。PostgreSQL基于自由的BSD/MIT許可,組織可以使用、復制、修改和重新分發代碼,只需要提供一個版權聲明即可。
可靠性是PostgreSQL的最高優先級。它以堅如磐石的品質和良好的工程化而聞名,支持高事務、任務關鍵型應用。PostgreSQL的文檔非 常精良,提供了大量免費的在線手冊,還針對舊版本提供了歸檔的參考手冊。PostgreSQL的社區支持是非常棒的,還有來自于獨立廠商的商業支持。
數據一致性與完整性也是PostgreSQL的高優先級特性。PostgreSQL是完全支持ACID特性的,它對于數據庫訪問提供了強大的安全性 保證,充分利用了企業安全工具,如Kerberos與Openssl等。你可以定義自己的檢查,根據自己的業務規則確保數據質量。
在眾多的管理特性 中,point-in-time recovery(PITR)是非常棒的特性,這是個靈活的高可用特性,提供了諸如針對失敗恢復創建熱備份以及快照與恢復的能力。但這并不是 PostgreSQL的全部,項目還提供了幾個方法來管理PostgreSQL以實現高可用、負載均衡與復制等,這樣你就可以使用適合自己特定需求的功能了。
postgresql和mysql的區別
特性 | 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 觸發器來進行審計。 |
備份、恢復和日志 | InnoDB 使用寫前(write-ahead)日志記錄。支持在線和離線完全備份以及崩潰和事務恢復。需要第三方軟件才能支持熱備份。 | 在數據目錄的一個子目錄中維護寫前日志。支持在線和離線完全備份以及崩潰、時間點和事務恢復。 可以支持熱備份。 |
約束 | 支持主鍵、外鍵、惟一和非空約束。對檢查約束進行解析,但是不強制實施。 | 支持主鍵、外鍵、惟一、非空和檢查約束。 |
存儲過程和用戶定義函數 | 支持 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 在會話級進行設置。 ? |
VS | PostgreSQL | MySQL |
---|---|---|
開源 | PostgreSQL是一個免費的開源系統,它受PostgreSQL許可證(自由的開源許可證)的約束。 | MySQL屬于Oracle旗下產品,并提供幾種付費版本供用戶使用 |
管理 | PostgreSQL是全球用戶共同發展的產品 | MySQL是gnu通用公共許可以及各種專有協議條款下的產品 |
性能 | PostgreSQL適合對讀寫速度要求很高的大型系統中使用 | MySQL主要用于Web應用程序,該Web應用程序僅需要數據庫來進行數據交易。 |
遵循ACID | PostgreSQL從頭到尾都遵循ACID原則,并確保滿足需求 | MySQL只有在使用InnoDB和NDB集群存儲引擎時才符合ACID要求。 |
SQL 兼容性 | “從文檔看,PostgreSQL是兼容大部分SQL的。 PostgreSQL支持SQL:2011的大多數功能。在核心一致性所需的179個強制性功能中,PostgreSQL至少兼容160個。此外,還有一系列受支持的可選功能。” | “從文檔看,MySQL在某些版本是兼容部分SQL。 我們對該產品的主要目標之一是繼續努力達到SQL標準的要求,但又不犧牲速度或可靠性。我們可以添加SQL擴展或對非SQL功能的支持,如果這樣可以極大地提高MySQL服務器在我們大部分用戶群中的可用性。” |
支持平臺 | PostgreSQL可以運行在Linux, Windows (Win2000 SP4 及以上),FreeBSD,OpenBSD,NetBSD , Mac OS X, AIX, IRIX ,Solaris和 Tu64. 也支持由技術巨頭惠普開發的HP-UX OS,以及開源的unix OS。 | MySQL可以運行在Oracle Solaris,microsoft Windows, Linux Mac OS X。MySQL擴展了對開源FreeBSD OS的支持 |
編程語言支持 | PostgreSQL是用c語言編寫的,它支持多種編程語言,最突出的C/C++, Delphi, JavaScript, Java, Python, R , Tcl , Go, lisp, erlang和.Net. | PostgreSQL是用C和C++編寫的,它支持C/C++, Erlang,PHP,Lisp,和Go, Perl,Java, Delphi, R ,和 Node.JS. |
物化視圖 | PostgreSQL支持物化視圖 | MySQL不支持物化視圖 |
數據備份 | PostgreSQL支持主備復制,并且還可以通過實現第三方擴展來處理其他類型的復制 | MySQL支持主備復制,其中每個節點都是主節點,并且有權更新數據 |
可拓展性 | PostgreSQL是高度可擴展的,您可以添加和擁有數據類型,運算符,索引類型和功能語言。 | MySQL不支持拓展性。 |
訪問方法 | PostgreSQL支持所有標準。 | MySQL支持所有標準。 |
社區支持 | PostgreSQL有一個活躍的社區支持,該社區幫助改善現有功能,其富有創造力的提交者竭盡全力確保該數據庫保持最新的功能和最大的安全性,成為最先進的數據庫。 | MySQL也有一個龐大的追隨者社區,這些社區貢獻者,特別是在被Oracle收購之后,主要關注一些偶爾出現的新功能,并維護現有功能。 |
安全性 | PostgreSQL為連接提供本機SSL支持,以加密客戶端/服務器通信。 PSQL還具有行級安全性。 | MySQL是高度安全的,并且包含多個安全功能。 |
PostgreSQL相對于MySQL的優勢
-
在SQL的標準實現上要比MySQL完善,而且功能實現比較嚴謹;
-
存儲過程的功能支持要比MySQL好,具備本地緩存執行計劃的能力;
-
對表連接支持較完整,優化器的功能較完整,支持的索引類型很多,復雜查詢能力較強;
-
PG主表采用堆表存放,MySQL采用索引組織表,能夠支持比MySQL更大的數據量。
-
PG的主備復制屬于物理復制,相對于MySQL基于binlog的邏輯復制,數據的一致性更加可靠,復制性能更高,對主機性能的影響也更小。
-
MySQL的存儲引擎插件化機制,存在鎖機制復雜影響并發的問題,而PG不存在。
MySQL相對于PG的優勢:
-
innodb的基于回滾段實現的MVCC機制,相對PG新老數據一起存放的基于XID的MVCC機制,是占優的。新老數據一起存放,需要定時觸 發VACUUM,會帶來多余的IO和數據庫對象加鎖開銷,引起數據庫整體的并發能力下降。而且VACUUM清理不及時,還可能會引發數據膨脹;
-
MySQL采用索引組織表,這種存儲方式非常適合基于主鍵匹配的查詢、刪改操作,但是對表結構設計存在約束;
-
MySQL的優化器較簡單,系統表、運算符、數據類型的實現都很精簡,非常適合簡單的查詢操作;
-
MySQL分區表的實現要優于PG的基于繼承表的分區實現,主要體現在分區個數達到上千上萬后的處理性能差異較大。
-
MySQL的存儲引擎插件化機制,使得它的應用場景更加廣泛,比如除了innodb適合事務處理場景外,myisam適合靜態數據的查詢場景。
【相關推薦:mysql視頻教程】