熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> MySQL >> 正文

客觀公正地評價MySQL和PostgreSQL的優劣

2013-11-23 21:01:20  來源: MySQL 

  前言
  前一段時間我曾經翻譯過一篇將你的網站從MySQL改為PostgreSQL其實當初我更感興趣的是一個應用程序的後台數據庫從MySQL轉為PostgreSQL的具體操作並沒有關心MySQL和PostgreSQL的優劣沒想到反應出乎意料的大因此我也就覺得有寫這篇文章的必要了
  在這篇文章中我們選用MySQL alpha與PostgreSQL 進行比較因為MySQL alpha開始支持事務的概念因此這樣的比較對於MySQL應該較為有利
  我們這樣的比較不想僅僅成為一份性能測試報告因為至少從我個人來看對於一個數據庫穩定性和速度並不能代表一切對於一個成熟的數據庫穩定性肯定會日益提供而隨著硬件性能的飛速提高速度也不再是什麼太大的問題
  
  兩者的共同優勢
  這兩個產品都屬於開放源碼的一員性能和功能都在高速地提高和增強MySQL AB的人們和PostgreSQL的開發者們都在盡可能地把各自的數據庫改得越來越好所以對於任何商業數據庫使用其中的任何一個都不能算是錯誤的選擇
  
  兩者不同的背景
  MySQL的背後是一個成熟的商業公司而PostgreSQL的背後是一個龐大的志願開發組這使得MySQL的開發過程更為慎重而PostgreSQL的反應更為迅速
  這樣的兩種背景直接導致了各自固有的優點和缺點
  
  MySQL的主要優點
  首先是速度MySQL通常要比PostgreSQL快得多MySQL自已也宣稱速度是他們追求的主要目標之一基於這個原因MySQL在以前的文檔中也曾經說過並不准備支持事務和觸發器但是在最新的文檔中我們看到MySQL alpha已經開始支持事務而且在MySQL的TODO中對觸發器約束這樣的注定會降低速度的功能也列入了日程但是我們仍然有理由相信MySQL將有可能一直保持速度的優勢
  MySQL比PostgreSQL更流行流行對於一個商業軟件來說也是一個很重要的指標流行意味著更多的用戶意味著經受了更多的考驗意味著更好的商業支持意味著更多更完善的文檔資料
  與PostgreSQL相比MySQL更適宜在Windows環境下運行MySQL作為一個本地的Windows應用程序運行(在NT/Win/WinXP下是一個服務)而PostgreSQL是運行在Cygwin模擬環境下PostgreSQL在Windows下運行沒有MySQL穩定應該是可以想象的
  MySQL使用了線程而PostgreSQL使用的是進程在不同線程之間的環境轉換和訪問公用的存儲區域顯然要比在不同的進程之間要快得多
  MySQL可以適應/運行在絕大多數情況下你不需要為MySQL運行任何清除程序PostgreSQL目前仍不完全適應/運行這是因為你必須每隔一段時間運行一次VACUUM
  MySQL在權限系統上比PostgreSQL某些方面更為完善PostgreSQL只支持對於每一個用戶在一個數據庫上或一個數據表上的INSERTSELECT和UPDATE/DELETE的授權而MySQL允許你定義一整套的不同的數據級表級和列級的權限對於列級的權限PostgreSQL可以通過建立視圖並確定視圖的權限來彌補MySQL還允許你指定基於主機的權限這對於目前的PostgreSQL是無法實現的但是在很多時候這是有用的
  由於MySQL alpha開始支持事務的概念因此事務對於MySQL不再僅僅成為劣勢相反因為MySQL保留無事務的表類型這就為用戶提供了更多的選擇
  MySQL的MERGE表提供了一個獨特管理多個表的方法
  MySQL的myisampack可以對只讀表進行壓縮此後仍然可以直接訪問該表中的行
  
  PostgreSQL的主要優點
  對事務的支持與MySQL相比經歷了更為徹底的測試對於一個嚴肅的商業應用來說事務的支持是不可或缺的
  MySQL對於無事務的MyISAM表采用表鎖定一個長時間運行的查詢很可能會長時間地阻礙對表的更新而PostgreSQL不存在這樣的問題
  PostgreSQL支持存儲過程而目前MySQL不支持對於一個嚴肅的商業應用來說作為數據庫本身有眾多的商業邏輯的存在此時使用存儲過程可以在較少地增加數據庫服務器的負擔的前提下對這樣的商業邏輯進行封裝並可以利用數據庫服務器本身的內在機制對存儲過程的執行進行優化此外存儲過程的存在也避免了在網絡上大量的原始的SQL語句的傳輸這樣的優勢是顯而易見的
  對視圖的支持視圖的存在同樣可以最大限度地利用數據庫服務器內在的優化機制而且對於視圖權限的合理使用事實上可以提供行級別的權限這是MySQL的權限系統所無法實現的
  對觸發器的支持觸發器的存在不可避免的會影響數據庫運行的效率但是與此同時觸發器的存在也有利於對商業邏輯的封裝可以減少應用程序中對同一商業邏輯的重復控制合理地使用觸發器也有利於保證數據的完整性
  對約束的支持約束的作用更多地表現在對數據完整性的保證上合理地使用約束也可以減少編程的工作量
  對子查詢的支持雖然在很多情況下在SQL語句中使用子查詢效率低下而且絕大多數情況下可以使用帶條件的多表連接來替代子查詢但是子查詢的存在在很多時候仍然不可避免而且使用子查詢的SQL語句與使用帶條件的多表連接相比具有更高的程序可讀性
  支持Rtrees這樣可擴展的索引類型可以更方便地處理一些特殊數據
  PostgreSQL可以更方便地使用UDF(用戶定義函數)進行擴展
  
  那麼我究竟應該使用MySQL還是PostgreSQL
  這個問題很難說得清而且事實上除了MySQL和PostgreSQL外使用OracleSybaseInformix等也是明智的選擇如何你確定只在MySQL和PostgreSQL中進行選擇以下規則總是有效的
  如果你的操作系統是Windows你應該使用MySQL
  如果你對數據庫並不了十分了解甚至不知道事務存儲過程等究竟是什麼你應該使用MySQL
  如果你的應用對數據的完整性和嚴肅性要求不高但是追求處理的高速度例如是一個論壇和社區你應該使用MySQL
  你的應用是一個嚴肅的商業應用對數據完整性要求很高而且你希望對一些商業數據邏輯進行很好的封裝例如是一個網上銀行你應該使用PostgreSQL
  你的應用處理的是地理數據由於RTREES的存在你應該使用PostgreSQL
  你是一個數據庫內核的狂熱愛好者你甚至希望擁有你自己版本的數據庫毫無疑問你必須使用PostgreSQL沒准下一個PostgreSQL版本中某一個模塊的作者就是你
  
  結語
  以上只是希望從我的理解客觀公正地評價MySQL和PostgreSQL的優劣其中的帶有傾向性的意見只代表個人觀點由於本人水平的限制有不當之處還請批評指正
From:http://tw.wingwit.com/Article/program/MySQL/201311/29459.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.