轉(zhuǎn):
http://news.csdn.net/n/20060801/93169.html
這篇文章中,我們選用MySQL 4.0.2-alpha與PostgreSQL 7.2進(jìn)行比較,因?yàn)镸ySQL 4.0.2-alpha開(kāi)始支持事務(wù)的概念,因此這樣的比較對(duì)于MySQL應(yīng)該較為有利。
我們這樣的比較不想僅僅成為一份性能測(cè)試報(bào)告,因?yàn)橹辽購(gòu)奈覀€(gè)人來(lái)看,對(duì)于一個(gè)數(shù)據(jù)庫(kù),穩(wěn)定性和速度并不能代表一切。對(duì)于一個(gè)成熟的數(shù)據(jù)庫(kù),穩(wěn)定性肯定會(huì)日益提供。而隨著硬件性能的飛速提高,速度也不再是什么太大的問(wèn)題。
一、兩者的共同優(yōu)勢(shì)
這兩個(gè)產(chǎn)品都屬于開(kāi)放源碼的一員,性能和功能都在高速地提高和增強(qiáng)。MySQL AB的人們和PostgreSQL的開(kāi)發(fā)者們都在盡可能地把各自的數(shù)據(jù)庫(kù)改得越來(lái)越好,所以對(duì)于任何商業(yè)數(shù)據(jù)庫(kù)使用其中的任何一個(gè)都不能算是錯(cuò)誤的選擇。
二、兩者不同的背景
MySQL的背后是一個(gè)成熟的商業(yè)公司,而PostgreSQL的背后是一個(gè)龐大的志愿開(kāi)發(fā)組。這使得MySQL的開(kāi)發(fā)過(guò)程更為慎重,而PostgreSQL的反應(yīng)更為迅速。
這樣的兩種背景直接導(dǎo)致了各自固有的優(yōu)點(diǎn)和缺點(diǎn)。
三、MySQL的主要優(yōu)點(diǎn)
1、首先是速度,MySQL通常要比PostgreSQL快得多。MySQL自已也宣稱速度是他們追求的主要目標(biāo)之一,基于這個(gè)原因,MySQL在以前的文檔中也曾經(jīng)說(shuō)過(guò)并不準(zhǔn)備支持事務(wù)和觸發(fā)器。但是在最新的文檔中,我們看到MySQL 4.0.2-alpha已經(jīng)開(kāi)始支持事務(wù),而且在MySQL的TODO中,對(duì)觸發(fā)器、約束這樣的注定會(huì)降低速度的功能也列入了日程。但是,我們?nèi)匀挥欣碛上嘈牛琈ySQL將有可能一直保持速度的優(yōu)勢(shì)。
2、MySQL比PostgreSQL更流行,流行對(duì)于一個(gè)商業(yè)軟件來(lái)說(shuō),也是一個(gè)很重要的指標(biāo),流行意味著更多的用戶,意味著經(jīng)受了更多的考驗(yàn),意味著更好的商業(yè)支持、意味著更多、更完善的文檔資料。
3、與PostgreSQL相比,MySQL更適宜在Windows環(huán)境下運(yùn)行。MySQL作為一個(gè)本地的Windows應(yīng)用程序運(yùn)行(在NT/Win2000/WinXP下,是一個(gè)服務(wù)),而PostgreSQL是運(yùn)行在Cygwin模擬環(huán)境下。PostgreSQL在Windows下運(yùn)行沒(méi)有MySQL穩(wěn)定,應(yīng)該是可以想象的。
4、MySQL使用了線程,而PostgreSQL使用的是進(jìn)程。在不同線程之間的環(huán)境轉(zhuǎn)換和訪問(wèn)公用的存儲(chǔ)區(qū)域顯然要比在不同的進(jìn)程之間要快得多。
5、MySQL可以適應(yīng)24/7運(yùn)行。在絕大多數(shù)情況下,你不需要為MySQL運(yùn)行任何清除程序。PostgreSQL目前仍不完全適應(yīng)24/7運(yùn)行,這是因?yàn)槟惚仨毭扛粢欢螘r(shí)間運(yùn)行一次VACUUM。
6、MySQL在權(quán)限系統(tǒng)上比PostgreSQL某些方面更為完善。PostgreSQL只支持對(duì)于每一個(gè)用戶在一個(gè)數(shù)據(jù)庫(kù)上或一個(gè)數(shù)據(jù)表上的INSERT、SELECT和UPDATE/DELETE的授權(quán),而MySQL允許你定義一整套的不同的數(shù)據(jù)級(jí)、表級(jí)和列級(jí)的權(quán)限。對(duì)于列級(jí)的權(quán)限,PostgreSQL可以通過(guò)建立視圖,并確定視圖的權(quán)限來(lái)彌補(bǔ)。MySQL還允許你指定基于主機(jī)的權(quán)限,這對(duì)于目前的PostgreSQL是無(wú)法實(shí)現(xiàn)的,但是在很多時(shí)候,這是有用的。
7、由于MySQL 4.0.2-alpha開(kāi)始支持事務(wù)的概念,因此事務(wù)對(duì)于MySQL不再僅僅成為劣勢(shì)。相反,因?yàn)镸ySQL保留無(wú)事務(wù)的表類型。這就為用戶提供了更多的選擇。
8、MySQL的MERGE表提供了一個(gè)獨(dú)特管理多個(gè)表的方法。
9、MySQL的myisampack可以對(duì)只讀表進(jìn)行壓縮,此后仍然可以直接訪問(wèn)該表中的行。
四、PostgreSQL的主要優(yōu)點(diǎn):
1、對(duì)事務(wù)的支持與MySQL相比,經(jīng)歷了更為徹底的測(cè)試。對(duì)于一個(gè)嚴(yán)肅的商業(yè)應(yīng)用來(lái)說(shuō),事務(wù)的支持是不可或缺的。
2、MySQL對(duì)于無(wú)事務(wù)的MyISAM表。采用表鎖定,一個(gè)長(zhǎng)時(shí)間運(yùn)行的查詢很可能會(huì)長(zhǎng)時(shí)間地阻礙對(duì)表的更新。而PostgreSQL不存在這樣的問(wèn)題。
3、PostgreSQL支持存儲(chǔ)過(guò)程,而目前MySQL不支持,對(duì)于一個(gè)嚴(yán)肅的商業(yè)應(yīng)用來(lái)說(shuō),作為數(shù)據(jù)庫(kù)本身,有眾多的商業(yè)邏輯的存在,此時(shí)使用存儲(chǔ)過(guò)程可以在較少地增加數(shù)據(jù)庫(kù)服務(wù)器的負(fù)擔(dān)的前提下,對(duì)這樣的商業(yè)邏輯進(jìn)行封裝,并可以利用數(shù)據(jù)庫(kù)服務(wù)器本身的內(nèi)在機(jī)制對(duì)存儲(chǔ)過(guò)程的執(zhí)行進(jìn)行優(yōu)化。此外存儲(chǔ)過(guò)程的存在也避免了在網(wǎng)絡(luò)上大量的原始的SQL語(yǔ)句的傳輸,這樣的優(yōu)勢(shì)是顯而易見(jiàn)的。
4、對(duì)視圖的支持,視圖的存在同樣可以最大限度地利用數(shù)據(jù)庫(kù)服務(wù)器內(nèi)在的優(yōu)化機(jī)制。而且對(duì)于視圖權(quán)限的合理使用,事實(shí)上可以提供行級(jí)別的權(quán)限,這是MySQL的權(quán)限系統(tǒng)所無(wú)法實(shí)現(xiàn)的。
5、對(duì)觸發(fā)器的支持,觸發(fā)器的存在不可避免的會(huì)影響數(shù)據(jù)庫(kù)運(yùn)行的效率,但是與此同時(shí),觸發(fā)器的存在也有利于對(duì)商業(yè)邏輯的封裝,可以減少應(yīng)用程序中對(duì)同一商業(yè)邏輯的重復(fù)控制。合理地使用觸發(fā)器也有利于保證數(shù)據(jù)的完整性。
6、對(duì)約束的支持。約束的作用更多地表現(xiàn)在對(duì)數(shù)據(jù)完整性的保證上,合理地使用約束,也可以減少編程的工作量。
7、對(duì)子查詢的支持。雖然在很多情況下在SQL語(yǔ)句中使用子查詢效率低下,而且絕大多數(shù)情況下可以使用帶條件的多表連接來(lái)替代子查詢,但是子查詢的存在在很多時(shí)候仍然不可避免。而且使用子查詢的SQL語(yǔ)句與使用帶條件的多表連接相比具有更高的程序可讀性。
8、支持R-trees這樣可擴(kuò)展的索引類型,可以更方便地處理一些特殊數(shù)據(jù)。
9、PostgreSQL可以更方便地使用UDF(用戶定義函數(shù))進(jìn)行擴(kuò)展。
五、那么我究竟應(yīng)該使用MySQL還是PostgreSQL
這個(gè)問(wèn)題很難說(shuō)得清,而且事實(shí)上除了MySQL和PostgreSQL外,使用Oracle、Sybase、Informix等也是明智的選擇。如何你確定只在MySQL和PostgreSQL中進(jìn)行選擇,以下規(guī)則總是有效的。
1、如果你的操作系統(tǒng)是Windows,你應(yīng)該使用MySQL。
2、如果你對(duì)數(shù)據(jù)庫(kù)并不了十分了解,甚至不知道事務(wù)、存儲(chǔ)過(guò)程等究竟是什么,你應(yīng)該使用MySQL。
3、如果你的應(yīng)用對(duì)數(shù)據(jù)的完整性和嚴(yán)肅性要求不高,但是追求處理的高速度。例如是一個(gè)論壇和社區(qū),你應(yīng)該使用MySQL。
4、你的應(yīng)用是一個(gè)嚴(yán)肅的商業(yè)應(yīng)用,對(duì)數(shù)據(jù)完整性要求很高。而且你希望對(duì)一些商業(yè)數(shù)據(jù)邏輯進(jìn)行很好的封裝,例如是一個(gè)網(wǎng)上銀行,你應(yīng)該使用PostgreSQL。
5、你的應(yīng)用處理的是地理數(shù)據(jù),由于R-TREES的存在,你應(yīng)該使用PostgreSQL。
6、你是一個(gè)數(shù)據(jù)庫(kù)內(nèi)核的狂熱愛(ài)好者,你甚至希望擁有你自己版本的數(shù)據(jù)庫(kù),毫無(wú)疑問(wèn),你必須使用PostgreSQL,沒(méi)準(zhǔn)下一個(gè)PostgreSQL版本中某一個(gè)模塊的作者就是你。
六、后記
以上只是作者從自己的理解盡量客觀公正地評(píng)價(jià)MySQL和PostgreSQL的優(yōu)劣。其中的帶有傾向性的意見(jiàn)只代表作者個(gè)人觀點(diǎn),有關(guān)這兩個(gè)數(shù)據(jù)庫(kù),歡迎廣大朋友提出自己的看法。