如果打算為項目選擇一款免費、開源的數(shù)據(jù)庫,那么你可能會在MySQL與PostgreSQL之間猶豫不定。MySQL與PostgreSQL都是免費、開源、強(qiáng)大、且功能豐富的數(shù)據(jù)庫。你主要的問題可能是:哪一個才是最好的開源數(shù)據(jù)庫,MySQL還是PostgreSQL呢?該選擇哪一個開源數(shù)據(jù)庫呢?
崇仁網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),崇仁網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為崇仁1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的崇仁做網(wǎng)站的公司定做!
在選擇數(shù)據(jù)庫時,你所做的是個長期的決策,因為后面如果再改變決定將是非常困難且代價高昂的。你希望一開始就選擇正確。兩個流行的開源數(shù)據(jù)庫MySQL與PostgreSQL常常成為最后要選擇的產(chǎn)品。對這兩個開源數(shù)據(jù)庫的高層次概覽將會有助于你選擇最適合自己需要的。
MySQL
MySQL相對來說比較年輕,首度出現(xiàn)在1994年。它聲稱自己是最流行的開源數(shù)據(jù)庫。MySQL就是LAMP(用于Web開發(fā)的軟件包,包括Linux、Apache及Perl/PHP/Python)中的M。構(gòu)建在LAMP棧之上的大多數(shù)應(yīng)用都會使用MySQL,包括那些知名的應(yīng)用,如WordPress、Drupal、Zend及phpBB等。
一開始,MySQL的設(shè)計目標(biāo)是成為一個快速的Web服務(wù)器后端,使用快速的索引序列訪問方法(ISAM),不支持ACID。經(jīng)過早期快速的發(fā)展之后,MySQL開始支持更多的存儲引擎,并通過InnoDB引擎實現(xiàn)了ACID。MySQL還支持其他存儲引擎,提供了臨時表的功能(使用MEMORY存儲引擎),通過MyISAM引擎實現(xiàn)了高速讀的數(shù)據(jù)庫,此外還有其他的核心存儲引擎與第三方引擎。
MySQL的文檔非常豐富,有很多質(zhì)量不錯的免費參考手冊、圖書與在線文檔,還有來自于Oracle和第三方廠商的培訓(xùn)與支持。
MySQL近幾年經(jīng)歷了所有權(quán)的變更和一些頗具戲劇性的事件。它最初是由MySQL AB開發(fā)的,然后在2008年以10億美金的價格賣給了Sun公司,Sun公司又在2010年被Oracle收購。Oracle支持MySQL的多個版本:Standard、Enterprise、Classic、Cluster、Embedded與Community。其中有一些是免費下載的,另外一些則是收費的。其核心代碼基于GPL許可,對于那些不想使用GPL許可的開發(fā)者與廠商來說還有商業(yè)許可可供使用。
現(xiàn)在,基于最初的MySQL代碼還有更多的數(shù)據(jù)庫可供選擇,因為幾個核心的MySQL開發(fā)者已經(jīng)發(fā)布了MySQL分支。最初的MySQL創(chuàng)建者之一Michael "Monty" Widenius貌似后悔將MySQL賣給了Sun公司,于是又開發(fā)了他自己的MySQL分支MariaDB,它是免費的,基于GPL許可。知名的MySQL開發(fā)者Brian Aker所創(chuàng)建的分支Drizzle對其進(jìn)行了大量的改寫,特別針對多CPU、云、網(wǎng)絡(luò)應(yīng)用與高并發(fā)進(jìn)行了優(yōu)化。
PostgreSQL
PostgreSQL標(biāo)榜自己是世界上最先進(jìn)的開源數(shù)據(jù)庫。PostgreSQL的一些粉絲說它能與Oracle相媲美,而且沒有那么昂貴的價格和傲慢的客服。它擁有很長的歷史,最初是1985年在加利福尼亞大學(xué)伯克利分校開發(fā)的,作為Ingres數(shù)據(jù)庫的后繼。
PostgreSQL是完全由社區(qū)驅(qū)動的開源項目,由全世界超過1000名貢獻(xiàn)者所維護(hù)。它提供了單個完整功能的版本,而不像MySQL那樣提供了多個不同的社區(qū)版、商業(yè)版與企業(yè)版。PostgreSQL基于自由的BSD/MIT許可,組織可以使用、復(fù)制、修改和重新分發(fā)代碼,只需要提供一個版權(quán)聲明即可。
可靠性是PostgreSQL的最高優(yōu)先級。它以堅如磐石的品質(zhì)和良好的工程化而聞名,支持高事務(wù)、任務(wù)關(guān)鍵型應(yīng)用。PostgreSQL的文檔非常精良,提供了大量免費的在線手冊,還針對舊版本提供了歸檔的參考手冊。PostgreSQL的社區(qū)支持是非常棒的,還有來自于獨立廠商的商業(yè)支持。
數(shù)據(jù)一致性與完整性也是PostgreSQL的高優(yōu)先級特性。PostgreSQL是完全支持ACID特性的,它對于數(shù)據(jù)庫訪問提供了強(qiáng)大的安全性保證,充分利用了企業(yè)安全工具,如Kerberos與OpenSSL等。你可以定義自己的檢查,根據(jù)自己的業(yè)務(wù)規(guī)則確保數(shù)據(jù)質(zhì)量。在眾多的管理特性中,point-in-time recovery(PITR)是非常棒的特性,這是個靈活的高可用特性,提供了諸如針對失敗恢復(fù)創(chuàng)建熱備份以及快照與恢復(fù)的能力。但這并不是PostgreSQL的全部,項目還提供了幾個方法來管理PostgreSQL以實現(xiàn)高可用、負(fù)載均衡與復(fù)制等,這樣你就可以使用適合自己特定需求的功能了。
平臺
MySQL與PostgreSQL都出現(xiàn)在一些高流量的Web站點上:
MySQL:Slashdot、Twitter、Facebook與Wikipedia
PostgreSQL:Yahoo使用了一個修改的PostgreSQL數(shù)據(jù)庫來處理每天數(shù)以億計的事件,還有Reddit和Disqus
MySQL與PostgreSQL都能運行在多個操作系統(tǒng)上,如Linux、Unix、Mac OS X與Windows。他們都是開源、免費的,因此測試他們時的唯一代價就是你的時間與硬件。他們都很靈活且具有可伸縮性,可用在小型系統(tǒng)和大型分布式系統(tǒng)上。MySQL在一個領(lǐng)域上要比PostgreSQL更進(jìn)一步,那就是它的觸角延伸到了嵌入式領(lǐng)域,這是通過libmysqld實現(xiàn)的。PostgreSQL不支持嵌入式應(yīng)用,依然堅守在傳統(tǒng)的客戶端/服務(wù)器架構(gòu)上。
MySQL通常被認(rèn)為是針對網(wǎng)站與應(yīng)用的快速數(shù)據(jù)庫后端,能夠進(jìn)行快速的讀取和大量的查詢操作,不過在復(fù)雜特性與數(shù)據(jù)完整性檢查方面不太盡如人意。PostgreSQL是針對事務(wù)型企業(yè)應(yīng)用的嚴(yán)肅、功能完善的數(shù)據(jù)庫,支持強(qiáng)ACID特性和很多數(shù)據(jù)完整性檢查。他們二者都在某些任務(wù)上具有很快的速度,MySQL不同存儲引擎的行為有較大差別。MyISAM引擎是最快的,因為它只執(zhí)行很少的數(shù)據(jù)完整性檢查,適合于后端讀操作較多的站點,不過對于包含敏感數(shù)據(jù)的讀/寫數(shù)據(jù)庫來說就是個災(zāi)難了,因為MyISAM表最終可能會損壞。MySQL提供了修復(fù)MySQL表的工具,不過對于敏感數(shù)據(jù)來說,支持ACID特性的InnoDB則是個更好的選擇。
與之相反,PostgreSQL則是個只有單一存儲引擎的完全集成的數(shù)據(jù)庫。你可以通過調(diào)整postgresql.conf文件的參數(shù)來改進(jìn)性能,也可以調(diào)整查詢與事務(wù)。PostgreSQL文檔對于性能調(diào)優(yōu)提供了非常詳盡的介紹。
MySQL與PostgreSQL都是高可配置的,并且可以針對不同的任務(wù)進(jìn)行相應(yīng)的優(yōu)化。他們都支持通過擴(kuò)展來添加額外的功能。
一個常見的誤解就是MySQL要比PostgreSQL更容易學(xué)習(xí)。關(guān)系數(shù)據(jù)庫系統(tǒng)都是非常復(fù)雜的,這兩個數(shù)據(jù)庫的學(xué)習(xí)曲線其實是差不多的。
標(biāo)準(zhǔn)兼容性
PostgreSQL旨在實現(xiàn)SQL兼容性(當(dāng)前標(biāo)準(zhǔn)是ANSI-SQL:2008)。MySQL則兼容大部分SQL,不過還有自己的擴(kuò)展,可以支持NoSQL特性,這在參考手冊中都有介紹。每種方式都有優(yōu)缺點。兼容標(biāo)準(zhǔn)會讓數(shù)據(jù)庫管理員、數(shù)據(jù)庫開發(fā)者與應(yīng)用開發(fā)者更舒服一些,因為這意味著他們只需學(xué)習(xí)一套標(biāo)準(zhǔn)、一套特性和命令即可。這會節(jié)省時間,提升效率,也不會被鎖定在特定的廠商上。
支持使用非標(biāo)準(zhǔn)的自定義功能的人們認(rèn)為這樣可以快速采用新的特性,而不必等待標(biāo)準(zhǔn)進(jìn)程完成。ANSI/ISO標(biāo)準(zhǔn)在不斷演化,因此標(biāo)準(zhǔn)兼容性也是個變化的目標(biāo):知名的關(guān)系型數(shù)據(jù)庫Microsoft SQL Server、Oracle與IBM DB2也只是部分兼容于標(biāo)準(zhǔn)。
結(jié)論
雖然有不同的歷史、引擎與工具,不過并沒有明確的參考能夠表明這兩個數(shù)據(jù)庫哪一個能夠適用于所有情況。很多組織喜歡使用PostgreSQL,因為它的可靠性好,在保護(hù)數(shù)據(jù)方面很擅長,而且是個社區(qū)項目,不會陷入廠商的牢籠之中。MySQL更加靈活,提供了更多選項來針對不同的任務(wù)進(jìn)行裁剪。很多時候,對于一個組織來說,對某個軟件使用的熟練程度要比特性上的原因更重要。
你可以每天創(chuàng)建一個表,查詢數(shù)據(jù)的時候用union all合并起來查詢
這樣做的好處是,刪除的時候可以直接把表刪掉即可
autovacuum 是 postgresql 里非常重要的一個服務(wù)端進(jìn)程,能夠自動運行,在一定條件下自動觸發(fā)對 dead tuples 進(jìn)行清理并對表進(jìn)行分析。
1、當(dāng)update,delete的tuples數(shù)量超過 autovacuum_vacuum_scale_factor * table_size + autovacuum_vacuum_threshold
2、指定表上事務(wù)的最大年齡配置參數(shù)autovacuum_freeze_max_age,默認(rèn)為2億,達(dá)到這個閥值將觸發(fā) autovacuum進(jìn)程,從而避免 wraparound。
1、autovacuum_max_workers的建議值為CPU核數(shù)/3。CPU資源充足,I/O性能較好時,可以適當(dāng)加大。
2、對于更新頻繁的交易系統(tǒng),如果系統(tǒng)資源充足,可以縮小autovacuum_vacuum_scale_factor 與 autovacuum_vacuum_threshold,讓vacuum清理頻繁
更改單表autovacuum相關(guān)參數(shù)