Instance通過執行MySQL命令(mysqld)啟動實例。壹個實例可以管理壹個或多個數據庫。壹臺服務器可以運行多個mysqld實例。實例管理器可以監控mysqld的每個實例。
通過執行Postmaster進程(pg_ctl)啟動實例。壹個實例可以管理壹個或多個構成集群的數據庫。群集是磁盤上的壹個區域,在安裝時初始化,由存儲所有數據的目錄組成。使用initdb創建第壹個數據庫。可以在壹臺機器上啟動多個實例。
數據庫數據庫是壹個命名的對象集合,它是壹個實例中獨立於其他數據庫的實體。MySQL實例* * *中的所有數據庫都享有相同的系統目錄。數據庫是命名的對象集合,每個數據庫都是壹個獨立於其他數據庫的實體。每個數據庫都有自己的系統目錄,但是所有的數據庫* * *都享受pg_databases。
數據緩沖器通過配置參數innodb_buffer_pool_size設置數據緩沖器。這個參數是內存緩沖區中的字節數,InnoDB用它來緩存表的數據和索引。在專用數據庫服務器上,該參數可以設置為機器物理內存的最大值80%。共享緩沖區緩存。默認情況下,分配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使用預寫日誌記錄。支持在線和離線完整備份以及崩潰和事務恢復。需要第三方軟件來支持熱備份。在數據目錄的子目錄中維護寫前日誌。支持在線和離線完整備份和崩潰、時間點和事務恢復。可以支持熱備份。
JDBC驅動程序您可以從參考資料下載JDBC驅動程序。您可以從參考資料下載JDBC驅動程序。
表類型取決於存儲引擎。例如,NDB存儲引擎支持分區表,內存引擎支持內存表。支持範圍和列表類型的臨時表、常規表和分區表。不支持哈希分區表。因為PostgreSQL的表分區是通過表繼承和規則系統來完成的,所以可以實現更復雜的分區方法。
索引類型取決於存儲引擎。MyISAM:BTREE,InnoDB:BTREE .支持b樹、哈希、R樹和Gist索引。
約束支持主鍵、外鍵、唯壹和非空約束。分析Check約束,但不強制執行。支持主鍵、外鍵、唯壹、非空和檢查約束。
存儲過程和用戶定義函數支持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支持。
數據訪問和管理服務器優化表-回收未使用的空間並消除數據文件的碎片。
MyISAMchk-analyze-更新查詢優化器(Myisam存儲引擎)使用的統計信息
MySQL-命令行工具
MySQL Administrator-Vacuum,壹個面向客戶端的GUI工具-回收未使用的空間。
分析——更新查詢優化器使用的統計信息。
psql-命令行工具
pg admin-客戶端GUI工具
並發控制支持表級和行級鎖。InnoDB存儲引擎支持READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ和SERIALIZABLE。使用SET TRANSACTION ISOLATION LEVEL語句在事務級別設置隔離級別。支持表級和行級鎖。支持的ANSI隔離級別是Read Committed(默認情況下-查詢開始時可以看到數據庫的快照)和Serialization(類似於可重復讀取-只能看到事務開始前提交的結果)。使用SET TRANSACTION語句在事務級別設置隔離級別。使用SET SESSION在會話級別進行設置。
MySQL優於PostgreSQL的缺點:
關系型數據庫
壹種數據庫系統
最重要的引擎InnoDB長期被甲骨文控制。目前整個MySQL數據庫由Oracle控制。
BSD協議不是大公司壟斷的。
復雜查詢的處理能力較弱,查詢優化器也不夠成熟。
非常強大的查詢優化器,支持非常復雜的查詢處理。
只有壹種類型的表連接:嵌套循環連接,不支持排序合並連接和哈希連接。
都支持
性能優化工具和測量信息不足。
提供了壹些性能視圖,可以方便地查看發生在表和索引上的選擇、刪除、更新和插入的統計數據,以及緩存命中率。互聯網上有壹個開源的pgstatspack工具。
InnoDB表和索引以同樣的方式存儲。也就是說,所有的表都是索引組織表。這壹般要求主鍵不能太長,插入時最好按順序增加主鍵,否則對性能影響很大。
不存在這個問題。
大多數查詢只能在表上使用壹個索引;在某些情況下,會有使用多個索引的查詢,但是查詢優化器通常會低估其成本,並且它們通常比表掃描慢。
不存在這個問題。
向表中添加列基本上就是重建表和索引,這將需要很長時間。
向表中添加列只會將表定義添加到數據字典中,而不會重新生成表。
存儲過程和觸發器的功能有限。用於編寫存儲過程、觸發器、預定事件和存儲函數的語言很弱。
除了用pl/pgsql編寫存儲過程,還支持perl、python和Tcl類型的存儲過程:pl/perl、pl/python和pl/tcl。
它還支持用C語言編寫存儲過程。
不支持序列。
支持
不支持函數索引,基於特定列的索引只能在中創建。
不支持實體化視圖。
支持函數索引,也支持壹些數據索引,物化視圖的功能可以通過規則系統實現。
執行計劃不是全局共享的,而只是在連接內部共享。
* * *享受實施方案。
MySQL支持的SQL語法(ANSI SQL標準)的壹小部分。不支持遞歸查詢、通用表表達式(Oracle with語句)或窗口函數(分析函數)。
都支持
不支持用戶定義的類型或域。
支持。
對於時間、日期和間隔等時間類型,秒以下沒有存儲類型。
可以精確到秒以下。
認證功能完全內置,不支持操作系統認證、PAM認證、LDAP等類似的外部認證功能。
支持操作系統認證、Kerberos認證、Ident認證、LDAP認證和PAM認證。
不支持數據庫鏈接。有壹個名為Federated的存儲引擎,它可以用作將查詢語句傳輸到遠程服務器中的表的中繼。但其功能粗糙,漏洞很多。
有dblink,還有壹個dbi-link的東西,可以連接oracle和mysql。
Mysql Cluster可能和妳想象的大相徑庭。開源集群軟件很少。
復制功能是異步的,有很大的局限性。比如它是單線程的,所以處理能力更強的從機很難跟上處理能力相對較慢的主機。
豐富的開源集群軟件支持。
說明實施計劃的結果很簡單。
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沒有回滾段,舊數據記錄在原始文件中,所以當數據庫異常崩潰時,不會像oracle和Innodb數據庫的恢復那麽復雜,因為oracle和Innodb的同步需要重做和撤銷。所以PostgreSQL數據庫出現異常崩潰後,數據庫上不去的概率比oracle和mysql小。
2.因為舊數據直接記錄在數據文件中,而不是回滾段中,所以它不會像oracle那樣頻繁地報告ora-01555錯誤。
3.回滾可以很快完成,因為回滾不刪除數據,而oracle和Innodb回滾時非常復雜。回滾事務時,必須清除事務所做的修改,刪除插入的記錄,更新記錄(見row_undo函數)。同時,回滾過程中會再次產生大量的重做日誌。
4.WAL log比oracle和Innodb簡單。對於oracle來說,不僅要記錄數據文件的變化,還要記錄回滾段的變化。
多個版本的PostgreSQL的主要缺點是:
1,最新版本和版本歷史沒有分開存儲,導致需要更多的掃描來清理舊版本,成本比較高。但壹般數據庫都有壹個高峰期,如果合理安排真空問題不大,真空在PostgreSQL9.0中得到了進壹步加強。
2.由於索引中根本沒有版本信息,所以無法實現覆蓋率索引掃描,即查詢只掃描索引,直接從索引返回所需屬性,還需要訪問表。Oracle和Innodb可以;
進程模式和線程模式的比較
PostgreSQL和oracle是進程模式,MySQL是線程模式。
進程模式對多個CPU的利用率很高。
進程模式* * *數據需要* *共享內存,而線程模式數據本身在進程空間是* * *共享的,所以不同的線程只需要控制線程之間的同步。
線程模式消耗的資源較少。
所以MySQL可以比oracle支持更多的連接。
對於PostgreSQL來說,如果不使用連接池軟件也存在這個問題,但是PostgreSQL中有優秀的連接池軟件,比如pgbouncer和pgpool,所以通過連接池可以支持很多連接。
堆表和索引組織表的比較
Oracle支持堆表和索引組織表。
PostgreSQL只支持堆表,不支持索引組織表。
Innodb只支持索引組織表。
索引組織表的優點:
表中數據按索引組織,數據有序。如果通過主鍵訪問數據,訪問數據會更快。當通過主鍵訪問數據時,堆表需要先通過主鍵索引找到數據的物理位置。
索引組織表的缺點:
在索引組織表中加入其他索引時,其他索引記錄的數據位置不再是物理位置,而是主鍵的值,所以對於索引組織表來說,主鍵的值不能太大,否則會占用很大的空間。
對於索引組織表,如果每次都在中間插入數據,可能會導致索引拆分,這會大大降低插入的性能。所以對於使用innodb來說,壹般最好是讓主鍵成為壹個無意義的序列,這樣每次插入都發生在末尾,以避免這個問題。
由於索引組織表是基於索引樹的,壹般來說,它對數據塊的訪問必須基於數據塊之間的關系,而不是物理塊,所以在掃描整個表時比堆表慢很多,這在OLTP中可能不明顯,但在數據倉庫的應用中可能是個問題。
PostgreSQL9.0中的特性:
PostgreSQL中的熱備功能
也就是說,在應用日誌同步時,standby還可以提供只讀服務,這對於讀寫分離非常有用。此功能僅在oracle11g中可用。
PostgreSQL異步提交的功能:
oracle中的此功能僅在oracle11g R2中可用。因為在很多應用場景下,機器宕機時允許少量數據丟失,所以這個功能特別適合這樣的場景。在PostgreSQL9.0中將synchronous_commit設置為false會打開該函數。需要註意的是,雖然設置為異步提交,但是當主機宕機時,PostgreSQL只會丟失少量數據,異步提交不會導致數據損壞,數據庫上不去。MySQL裏沒聽說過這個功能。
PostgreSQL中索引的特性:
PostgreSQL中可以有部分索引,即只能索引表中的部分數據,create index可以有where條件。同時PostgreSQL中的索引可以反向掃描,所以不需要在PostgreSQL中建立專門的降序索引。