PostgreSQL數據庫和與mysql的性能比

若是很粗略地觀察 PostgreSQL,會以爲這個數據庫系統和其它數據庫很相似。由於 PostgreSQL 使用 SQL 語言來在執行資料的查詢。這些資料經過連外鍵聯繫在一塊兒,以一系列表格的形式存在。PostgreSQL 相對於競爭者的主要優點,主要的特徵爲可編程性:對於使用數據庫資料的實際應用,PostgreSQL 讓開發與使用的工做,變得更加容易。

SQL 數據在"平面表格"中存儲簡單的數據類型,須要用戶使用查詢把有關的信息收集在一塊兒。這與應用和用戶利用數據自身的方式相對立:典型的使用帶有豐富數據類型的高級語言,在其中全部有關的數據做爲它本身的一個完整單元來操做。典型的稱呼爲記錄或對象(依據各自語言)。

轉換來自 SQL 世界的信息到面向對象編程世界體現得很困難,由於二者有很是不一樣的數據組織的模型。工業界把這個問題稱爲阻抗不匹配:從一個模型映射到另外一個要花費項目開發者 40% 的時間。一些映射解決方案,典型的稱爲對象-關係映射,致力於這個問題,可是它們花費不少並有自身的問題,致使糟糕的性能或強制全部的數據訪問經過映射所支持的一種語言來進行。

PostgreSQL 能夠直接在數據庫中解決不少這種問題。PostgreSQL 容許用戶定義基於正規的 SQL 類型的新類型,容許數據庫自身理解複雜數據。例如,你能夠定義一個 address 來組合一些事物如街道編號、城市和國度的字符串。從這一點上你能夠輕易的創建把保存地址的所須要的全部字段包含在一個單一行列中的表。

PostgreSQL 還容許類型包括繼承,這是在面向對象編程中的主要概念。例如,你能夠定義 post_code 類型,並接着基於它創建 us_zip_code 和 canadian_postal_code。在數據庫中的 address 就能夠採用 us_address 或者 canadian_address 形式,而特定的規則能夠在各自狀況下驗證數據。在 PostgreSQL 的早期版本中,實現新類型須要寫 C 擴展並把它們編譯到數據庫服務器中;在版本 7.4 中,經過 CREATE DOMAIN 創建和使用定製類型變得很容易了。

數據庫自身的編程能夠從使用函數上得到巨大的利益。多數 SQL 系統容許用戶寫存儲過程,它是其餘 SQL 語句能夠調用的一塊 SQL 代碼。可是 SQL 自身仍舊不適合做爲編程語言,並且 SQL 用戶在構造複雜邏輯時要經歷巨大的困難。更糟糕的是,SQL 自身不支持不少的編程語言中最基本的操做,好比分支和循環。每一個廠商都轉而寫它們本身對 SQL 語言的擴展來增長這些特徵,而這種擴展不是必須跨越數據庫平臺操做。

在 PostgreSQL 中程序員能夠用一組可觀的支持語言中任何一種來寫這種邏輯。

相似於 Oracle 的過程語言 PL/SQL 的叫作 PL/PgSQL 的內置語言,在處理查詢密集的過程時提供了獨特的優點。 
流行腳本語言好比 Perl,Python,Tcl,和 Ruby 的包裝器,容許利用它們在字符串處理和鏈接到廣闊的外部函數庫的力量。 
須要把複雜邏輯編譯到機器代碼所能提供的高性能的過程能夠利用 C 或 C++。 
在更加深奧的方面,R 統計語言的處理器容許數據庫查詢利用它的一組豐富的統計函數。 
程序員能夠把代碼做爲函數插入服務器中,它是使代碼相似於存儲過程的一個小包裝器。以這種方式 SQL 代碼能夠調用(好比)C 代碼或反之。

性能增進,由於數據庫引擎在一個時間一個地方調用全部的邏輯,減小了在客戶和服務器之間的來回往返的次數。 
可靠性增進,由於數據驗證代碼集中到一個地方,就在服務器上,而不用依賴在多個客戶應用中的同步邏輯,它們甚至可能以多種編程語言寫成。 
經過向服務器增長有用的抽象,客戶代碼能夠變得更短小和簡單。 
這些優點合起來能夠證明 PostgreSQL 從編程角度是最高級的數據庫系統。使用 PostgreSQL 能夠顯著的減小不少項目的總體編程時間,這種優點隨着項目複雜而增加。

[編輯] 特徵
[編輯] 函數
經過函數,能夠在數據庫服務器端執行指令程序。僅管這樣的指令程序可使用基本的SQL語句寫成,可是因爲其缺少流程控制等功能,因此在PostgreSQL中引入了使用其它程序語言編寫函數的能力,包括:

一個內置的名爲PL/pgSQL的過程語言,相似於Oracle的PL/SQL; 
包括PL/Perl,plPHP,PL/Python,PL/Ruby,PL/sh,PL/Tcl與 PL/Scheme在內的腳本語言; 
編譯語言:C,C++,或Java(經過PL/Java)。 
R統計語言(PL/R)。 
以上部分的語言,甚至能夠在觸發器內執行。PostgreSQL支持行返回函數:它們的輸出是一系列行類型數據的集合,能夠在查詢中看成表來使用。函數也能夠被定義成以建立者或者調用者的身份運行。在某些場合,或者其餘的數據庫產品中,函數也會被稱爲「存儲過程」,但技術上這二者並未有太大分別。

[編輯] 索引
在PostgreSQL中,用戶能夠自定義索引方法,或使用內置的B-tree,哈希表與GiST索引。PosrgreSQL的索引功能同時也具備如下功能:

反向索引檢索:無須額外的索引就能實現相似ORDER BY field DESC的操做。 
表達式索引:能夠創建基於表達式值而非數值或列的索引。 
部分索引:僅索引表的部分,能夠經過在CREATE INDEX語句口添加WHERE 從句以建立更小的索引。 
位圖索引掃描:從8.1版開始支持此功能。該功能將讀取多個索引,生成表示它們之間符合查詢標準的多元組交集的位圖。這樣解決了混合索引的問題。在一個具備20列的表中,理論上能建立 20! 個索引,在實際應用中已不現實。使用位圖索引掃描後,在每次查詢時,它將能把約束條件中所涉及列各自的索引進行任意的排列組合。 
[編輯] 觸發器
觸發器是由SQL語句查詢所觸發的事件。如:一個INSERT語句可能觸發一個檢查數據完整性的觸發器。觸發器一般由INSERT或UPDATE語句觸發。

在PostgreSQL中,可在數據表上設置觸發器,但沒法在視圖中設置(對視圖的UPDATE或者INSERT操做可使用規則(RULE)定義)。多個觸發器可依據字母順序依次執行。此外,除了使用內嵌的PL/PgSQL語言以外,觸發器的函數也能夠用PL/Perl,PL/Python等語言編寫。

[編輯] 多版本併發控制
PostgreSQL使用多版本併發控制(MVCC,Multiversion concurrency control)系統進行併發控制,該系統向每一個用戶提供了一個數據庫的「快照」,用戶在事務內所做的每一個修改,對於其餘的用戶都不可見,直到該事務成功提交。這從很大程度上減小了對讀取鎖的依賴,同時保證了數據庫高效地符合ACID原則。

[編輯] 規則
規則(RULE)容許一個查詢能被重寫,一般被用做實現可更新的視圖。

[編輯] 數據類型
PostgreSQL內置豐富的數據類型,包括:

任意精度的數值 
無限制長度文本 
幾何圖元 
IP地址與IPv6地址 
無類域間路由地址塊,MAC地址 
數組 
此外,用戶能夠建立自定義數據類型,一般經過PostgreSQL的GiST機制,它們也能被很好得索引,好比PostGIS地理信息系統的數據類型。

[編輯] 用戶定義對象
用戶能夠爲數據庫內幾乎全部的對象定義新的類型,包括:

索引 
操做符(可重載現有操做符。) 
聚合函數 
數據域 
數據類型轉換 
會話(編碼轉換) 
[編輯] Tools
Database Master - PostgreSQL Management Studio 
[編輯] 繼承
數據表的結構及屬性可從一個「父」表中繼承,數據將在二者間共享。對子表中數據的插入或者刪除也將在父表中體現,一樣,對父表做出的修改,好比添加列等操做也會致使子表產生相應改動。該功能還沒有徹底實現,實際上,表的約束尚不能繼承。好比,在一張外聯參考了父表id字段的表中,插入一條具備子表中某條記錄id數據的記錄會致使失敗,由於PostgreSQL在對父表的外鍵約束檢查中不會檢查子表的內容。

[編輯] 其餘功能
關係完整性約束:包括外聯鍵,列約束與行檢查 
視圖:暫時沒有實現可更新視圖,但可以使用規則系統實現相同功能 
Full, inner, outer (left/right) 聯合查詢 
子查詢 
事務處理 
支持大部分SQL:2003標準的主要特徵 [2] 以及不支持部分 將來版本的支持狀況,可至已有版本手冊中查詢。 
SSL加密鏈接 
二進制/文本 大對象的存儲 
在線備份 
數據域 
表分區 
表空間 
保存點 
時刻點恢復 
兩段式提交 
TOAST(The Oversized-Attribute Storage Technique,超大屬性存儲技術)用以透明地將超大表屬性(如大MIME附件或XML消息)壓縮後存儲至獨立的區域 
正則表達式 [3] 
[編輯] 擴展
地理數據對象:PostGIS GPL 
全文檢索:經過 Tsearch2 或 OpenFTS, 將在8.3版本中內嵌Tsearch2。 GPL 
多種異步主/從複製方案,包括Slony-I(BSD受權),Mammoth Replicator 

XML/XSLT支持 contrib軟件包中的XPath擴展 GPL  程序員

一.MySQL的主要優勢
  一、首先是速度,MySQL一般要比PostgreSQL快得多。MySQL自已也宣稱速度是他們追求的主要目標之一,基於這個緣由,MySQL在之前的文檔中也曾經說過並不許備支持事務和觸發器。可是在最新的文檔中,咱們看到MySQL 4.0.2-alpha已經開始支持事務,並且在MySQL的TODO中,對觸發器、約束這樣的註定會下降速度的功能也列入了日程。可是,咱們仍然有理由相信,MySQL將有可能一直保持速度的優點。
  二、MySQL比PostgreSQL更流行,流行對於一個商業軟件來講,也是一個很重要的指標,流行意味着更多的用戶,意味着經受了更多的考驗,意味着更好的商業支持、意味着更多、更完善的文檔資料。
  三、與PostgreSQL相比,MySQL更適宜在Windows環境下運行。MySQL做爲一個本地的Windows應用程序運行(在NT/Win2000/WinXP下,是一個服務),而PostgreSQL是運行在Cygwin模擬環境下。PostgreSQL在Windows下運行沒有MySQL穩定,應該是能夠想象的。
  四、MySQL使用了線程,而PostgreSQL使用的是進程。在不一樣線程之間的環境轉換和訪問公用的存儲區域顯然要比在不一樣的進程之間要快得多。
  五、MySQL能夠適應24/7運行。在絕大多數狀況下,你不須要爲MySQL運行任何清除程序。PostgreSQL目前仍不徹底適應24/7運行,這是由於你必須每隔一段時間運行一次VACUUM。
  六、MySQL在權限系統上比PostgreSQL某些方面更爲完善。PostgreSQL只支持對於每個用戶在一個數據庫上或一個數據表上的INSERT、SELECT和UPDATE/DELETE的受權,而MySQL容許你定義一整套的不一樣的數據級、表級和列級的權限。對於列級的權限,PostgreSQL能夠經過創建視圖,並肯定視圖的權限來彌補。MySQL還容許你指定基於主機的權限,這對於目前的PostgreSQL是沒法實現的,可是在不少時候,這是有用的。
  七、因爲MySQL 4.0.2-alpha開始支持事務的概念,所以事務對於MySQL再也不僅僅成爲劣勢。相反,由於MySQL保留無事務的表類型。這就爲用戶提供了更多的選擇。
  八、MySQL的MERGE表提供了一個獨特管理多個表的方法。
  九、MySQL的myisampack能夠對只讀表進行壓縮,此後仍然能夠直接訪問該表中的行。
  
二.PostgreSQL的主要優勢:
  一、對事務的支持與MySQL相比,經歷了更爲完全的測試。對於一個嚴肅的商業應用來講,事務的支持是不可或缺的。
  二、MySQL對於無事務的MyISAM表。採用表鎖定,一個長時間運行的查詢極可能會長時間地阻礙對錶的更新。而PostgreSQL不存在這樣的問題。
  三、PostgreSQL支持存儲過程,而目前MySQL不支持,對於一個嚴肅的商業應用來講,做爲數據庫自己,有衆多的商業邏輯的存在,此時使用存儲過程能夠在較少地增長數據庫服務器的負擔的前提下,對這樣的商業邏輯進行封裝,並能夠利用數據庫服務器自己的內在機制對存儲過程的執行進行優化。此外存儲過程的存在也避免了在網絡上大量的原始的SQL語句的傳輸,這樣的優點是顯而易見的。
  四、對視圖的支持,視圖的存在一樣能夠最大限度地利用數據庫服務器內在的優化機制。並且對於視圖權限的合理使用,事實上能夠提供行級別的權限,這是MySQL的權限系統所沒法實現的。
  五、對觸發器的支持,觸發器的存在不可避免的會影響數據庫運行的效率,可是與此同時,觸發器的存在也有利於對商業邏輯的封裝,能夠減小應用程序中對同一商業邏輯的重複控制。合理地使用觸發器也有利於保證數據的完整性。
  六、對約束的支持。約束的做用更多地表如今對數據完整性的保證上,合理地使用約束,也能夠減小編程的工做量。
  七、對子查詢的支持。雖然在不少狀況下在SQL語句中使用子查詢效率低下,並且絕大多數狀況下可使用帶條件的多表鏈接來替代子查詢,可是子查詢的存在在不少時候仍然不可避免。並且使用子查詢的SQL語句與使用帶條件的多表鏈接相比具備更高的程序可讀性。
  八、支持R-trees這樣可擴展的索引類型,能夠更方便地處理一些特殊數據。
  九、PostgreSQL能夠更方便地使用UDF(用戶定義函數)進行擴展。
正則表達式

相關文章
相關標籤/搜索