一前言 前一段時間
我曾經翻譯過一篇將你的網站從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只支持對於每一個用戶在一個數據庫上或一個數據表上的INSERT
SELECT和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語句與使用帶條件的多表連接相比具有更高的程序可讀性
支持R
trees這樣可擴展的索引類型
可以更方便地處理一些特殊數據
PostgreSQL可以更方便地使用UDF(用戶定義函數)進行擴展
六那麼我究竟應該使用MySQL還是PostgreSQL 這個問題很難說得清
而且事實上除了MySQL和PostgreSQL外
使用Oracle
Sybase
Informix等也是明智的選擇
如何你確定只在MySQL和PostgreSQL中進行選擇
以下規則總是有效的
如果你的操作系統是Windows
你應該使用MySQL
如果你對數據庫並不了十分了解
甚至不知道事務
存儲過程等究竟是什麼
你應該使用MySQL
如果你的應用對數據的完整性和嚴肅性要求不高
但是追求處理的高速度
例如是一個論壇和社區
你應該使用MySQL
你的應用是一個嚴肅的商業應用
對數據完整性要求很高
而且你希望對一些商業數據邏輯進行很好的封裝
例如是一個網上銀行
你應該使用PostgreSQL
你的應用處理的是地理數據
由於R
TREES的存在
你應該使用PostgreSQL
你是一個數據庫內核的狂熱愛好者
你甚至希望擁有你自己版本的數據庫
毫無疑問
你必須使用PostgreSQL
沒准下一個PostgreSQL版本中某一個模塊的作者就是你
七結語 以上只是希望從我的理解客觀公正地評價MySQL和PostgreSQL的優劣
其中的帶有傾向性的意見只代表個人觀點
由於本人水平的限制
有不當之處還請批評指正
From:http://tw.wingwit.com/Article/program/MySQL/201311/29459.html