一、PostgreSQL在各方面都優(yōu)于MySQL,但國內(nèi)大部分互聯(lián)網(wǎng)公司還堅(jiān)持使用MySQL的原因
1、MySQL使用起來更簡(jiǎn)單
MySQL在Windows平臺(tái)上安裝比較容易。早期的PostgreSQL沒有提供Windows平臺(tái)的版本,需要自己編譯。
2、學(xué)習(xí)MySQL更加容易
MySQL開箱即用,以root用戶連接非常簡(jiǎn)單,但是配置PostgreSQL、創(chuàng)建用戶等等操作比MySQL要復(fù)雜。
3、MySQL始終有公司背書
MySQL創(chuàng)建了社區(qū)和配套產(chǎn)品的生態(tài)系統(tǒng),無論是在線文檔,還是論壇都比PostgreSQL豐富。
4、MySQL更廣泛地應(yīng)用于Web應(yīng)用程序
MySQL比PostgreSQL更加廣泛地應(yīng)用于Web應(yīng)用程序,這些應(yīng)用程序需要大量的讀操作而不需要太多的寫操作。因?yàn)镸ySQL具有更好的讀性能和更高的可伸縮性,所以更適合這些場(chǎng)景。
二、PostgreSQL介紹
1、簡(jiǎn)介
PostgreSQL是一種特性非常齊全的自由軟件的對(duì)象-關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(ORDBMS),是以加州大學(xué)計(jì)算機(jī)系開發(fā)的POSTGRES,4.2版本為基礎(chǔ)的對(duì)象關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。POSTGRES的許多名列前茅概念只是在比較遲的時(shí)候才出現(xiàn)在商業(yè)網(wǎng)站數(shù)據(jù)庫中。PostgreSQL支持大部分的SQL標(biāo)準(zhǔn)并且提供了很多其他現(xiàn)代特性,如復(fù)雜查詢、外鍵、觸發(fā)器、視圖、事務(wù)完整性、多版本并發(fā)控制等。同樣,PostgreSQL也可以用許多方法擴(kuò)展,例如通過增加新的數(shù)據(jù)類型、函數(shù)、操作符、聚集函數(shù)、索引方法、過程語言等。另外,因?yàn)樵S可證的靈活,任何人都可以以任何目的免費(fèi)使用、修改和分發(fā)PostgreSQL。
2、主要優(yōu)點(diǎn)
維護(hù)者是PostgreSQL Global Development Group,首次發(fā)布于1989年6月。操作系統(tǒng)支持WINDOWS、Linux、UNIX、MAC OS X、BSD。從基本功能上來看,支持ACID、關(guān)聯(lián)完整性、數(shù)據(jù)庫事務(wù)、Unicode多國語言。表和視圖方面,PostgreSQL支持臨時(shí)表,而物化視圖,可以使用PL/pgSQL、PL/Perl、PL/Python或其他過程語言的存儲(chǔ)過程和觸發(fā)器模擬。索引方面,全面支持R-/R+tree索引、哈希索引、反向索引、部分索引、Expression 索引、GiST、GIN(用來加速全文檢索),從8.3版本開始支持位圖索引。其他對(duì)象上,支持?jǐn)?shù)據(jù)域,支持存儲(chǔ)過程、觸發(fā)器、函數(shù)、外部調(diào)用、游標(biāo)。數(shù)據(jù)表分區(qū)方面,支持4種分區(qū),即范圍、哈希、混合、列表。從事務(wù)的支持度上看,對(duì)事務(wù)的支持與MySQL相比,經(jīng)歷了更為徹底的測(cè)試。My ISAM表處理方式方面,MySQL對(duì)于無事務(wù)的MyISAM表,采用表鎖定,1個(gè)長時(shí)間運(yùn)行的查詢很可能會(huì)阻礙對(duì)表的更新,而PostgreSQL不存在這樣的問題。從存儲(chǔ)過程上看,PostgreSQL支持存儲(chǔ)過程。因?yàn)榇鎯?chǔ)過程的存在也避免了在網(wǎng)絡(luò)上大量原始的SQL語句的傳輸,這樣的優(yōu)勢(shì)是顯而易見的。用戶定義函數(shù)的擴(kuò)展方面,PostgreSQL可以更方便地使用UDF(用戶定義函數(shù))進(jìn)行擴(kuò)展。3、劣勢(shì)
最新版本和歷史版本不分離存儲(chǔ),導(dǎo)致清理老舊版本時(shí)需要做更多的掃描,代價(jià)比較大但一般的數(shù)據(jù)庫都有高峰期,如果合理安排VACUUM,這也不是很大的問題,而且在PostgreSQL9.0中VACUUM進(jìn)一步被加強(qiáng)了。在PostgreSQL中,由于索引完全沒有版本信息,不能實(shí)現(xiàn)Coverage index scan,即查詢只掃描索引,不能直接從索引中返回所需的屬性,還需要訪問表,而Oracle與Innodb則可以。4、內(nèi)存頁面
PostgreSQL內(nèi)存頁面的默認(rèn)大小是8kB。頁面的邏輯結(jié)構(gòu)被定義成三個(gè)部分:頁首部(PageHeader)、元組記錄空間(ltem Space)以及特殊空間(Special Space)。
頁首部記錄了頁面的使用信息,這些信息由元組記錄空間和特殊空間的偏移量地址、頁面分布格式版本號(hào)和頁面的事物日志記載點(diǎn)等等所組成。
元組記錄空間是存儲(chǔ)元組信息的地方,在這里面每個(gè)元組記錄被稱為一個(gè)ltem,Item由ltemld和元組數(shù)據(jù)組成,ltemld內(nèi)部定義了元組在頁面中的偏移量、ltem指針的狀態(tài)以及元組項(xiàng)的比特位數(shù)長度。
特殊空間是為了頁面操作所需要的。為了其他模塊對(duì)頁面進(jìn)行操作,PostgreSQL內(nèi)部定義了一些頁面的操作函數(shù)。頁面的相關(guān)操作包括頁面初始化、頁面添加、修復(fù)和刪除。供其他子模塊進(jìn)行調(diào)用。這里值得關(guān)注的是頁面修復(fù)與頁面批量刪除的操作函數(shù)。為了實(shí)現(xiàn)這兩個(gè)操作函數(shù),PostgreSQL專門定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)itemldSortData,它為方便在這兩個(gè)函數(shù)中對(duì)元組項(xiàng)Item實(shí)現(xiàn)降序排序而定義。
三、MySQL介紹
1、簡(jiǎn)介
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB 公司開發(fā),屬于Oracle旗下產(chǎn)品。MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,在 WEB 應(yīng)用方面,MySQL是較好的 RDBMS(Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一。MySQL是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng),關(guān)系數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉庫內(nèi),這樣就增加了速度并提高了靈活性。MySQL所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言。MySQL軟件采用了雙授權(quán)政策,分為社區(qū)版和商業(yè)版,由于其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點(diǎn),一般中小型和大型網(wǎng)站的開發(fā)都選擇MySQL作為網(wǎng)站數(shù)據(jù)庫。
2、系統(tǒng)特性
MySQL使用 C和 C++編寫,并使用了多種編譯器進(jìn)行測(cè)試,保證了源代碼的可移植性。支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多種操作系統(tǒng)。為多種編程語言提供了 API。這些編程語言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby,.NET和 Tcl 等。支持多線程,充分利用 CPU 資源。優(yōu)化的 SQL查詢算法,有效地提高查詢速度。既能夠作為一個(gè)單獨(dú)的應(yīng)用程序應(yīng)用在客戶端服務(wù)器網(wǎng)絡(luò)環(huán)境中,也能夠作為一個(gè)庫而嵌入到其他的軟件中。提供多語言支持,常見的編碼如中文的 GB 2312、BIG5,日文的 Shift_JIS等都可以用作數(shù)據(jù)表名和數(shù)據(jù)列名。提供 TCP/IP、ODBC 和 JDBC等多種數(shù)據(jù)庫連接途徑。提供用于管理、檢查、優(yōu)化數(shù)據(jù)庫操作的管理工具。支持大型的數(shù)據(jù)庫??梢蕴幚頁碛猩锨f條記錄的大型數(shù)據(jù)庫。支持多種存儲(chǔ)引擎。MySQL 是開源的,所以你不需要支付額外的費(fèi)用。MySQL 使用標(biāo)準(zhǔn)的 SQL數(shù)據(jù)語言形式。MySQL 對(duì) PHP 有很好的支持,PHP是比較流行的 Web 開發(fā)語言。MySQL是可以定制的,采用了 GPL協(xié)議,你可以修改源碼來開發(fā)自己的 MySQL 系統(tǒng)。在線 DDL/更改功能,數(shù)據(jù)架構(gòu)支持動(dòng)態(tài)應(yīng)用程序和開發(fā)人員靈活性。復(fù)制全局事務(wù)標(biāo)識(shí),可支持自我修復(fù)式集群。3、查詢和索引
只有當(dāng)數(shù)據(jù)庫里已經(jīng)有了足夠多的測(cè)試數(shù)據(jù)時(shí),它的性能測(cè)試結(jié)果才有實(shí)際參考價(jià)值。如果在測(cè)試數(shù)據(jù)庫里只有幾百條數(shù)據(jù)記錄,它們往往在執(zhí)行完名列前茅條查詢命令之后就被全部加載到內(nèi)存里,這將使后續(xù)的查詢命令都執(zhí)行得非??歙C不管有沒有使用索引。只有當(dāng)數(shù)據(jù)庫里的記錄超過了 1000 條、數(shù)據(jù)總量也超過了 MySQL 服務(wù)器上的內(nèi)存總量時(shí),數(shù)據(jù)庫的性能測(cè)試結(jié)果才有意義。
在不確定應(yīng)該在哪些數(shù)據(jù)列上創(chuàng)建索引的時(shí)候,人們從 EXPLAIN SELECT 命令那里往往可以獲得一些幫助。這其實(shí)只是簡(jiǎn)單地給一條普通的 SELECT 命令加一個(gè) EXPLAIN 關(guān)鍵字作為前綴而已。有了這個(gè)關(guān)鍵字,MySQL 將不是去執(zhí)行那條 SELECT 命令,而是去對(duì)它進(jìn)行分析。MySQL 將以表格的形式把查詢的執(zhí)行過程和用到的索引等信息列出來。
在 EXPLAIN 命令的輸出結(jié)果里,第1列是從數(shù)據(jù)庫讀取的數(shù)據(jù)表的名字,它們按被讀取的先后順序排列。type列指定了本數(shù)據(jù)表與其它數(shù)據(jù)表之間的關(guān)聯(lián)關(guān)系(JOIN)。在各種類型的關(guān)聯(lián)關(guān)系當(dāng)中,效率較高的是 system,然后依次是 const、eq_ref、ref、range、index 和 All(All 的意思是:對(duì)應(yīng)于上一級(jí)數(shù)據(jù)表里的每一條記錄,這個(gè)數(shù)據(jù)表里的所有記錄都必須被讀取一遍——這種情況往往可以用一索引來避免)。
possible_keys 數(shù)據(jù)列給出了 MySQL 在搜索數(shù)據(jù)記錄時(shí)可選用的各個(gè)索引。key 數(shù)據(jù)列是 MySQL 實(shí)際選用的索引,這個(gè)索引按字節(jié)計(jì)算的長度在 key_len 數(shù)據(jù)列里給出。比如說,對(duì)于一個(gè) INTEGER 數(shù)據(jù)列的索引,這個(gè)字節(jié)長度將是4。如果用到了復(fù)合索引,在 key_len 數(shù)據(jù)列里還可以看到 MySQL 具體使用了它的哪些部分。作為一般規(guī)律,key_len 數(shù)據(jù)列里的值越小越好。
ref 數(shù)據(jù)列給出了關(guān)聯(lián)關(guān)系中另一個(gè)數(shù)據(jù)表里的數(shù)據(jù)列的名字。row 數(shù)據(jù)列是 MySQL 在執(zhí)行這個(gè)查詢時(shí)預(yù)計(jì)會(huì)從這個(gè)數(shù)據(jù)表里讀出的數(shù)據(jù)行的個(gè)數(shù)。row 數(shù)據(jù)列里的所有數(shù)字的乘積可以大致了解這個(gè)查詢需要處理多少組合。
最后,extra 數(shù)據(jù)列提供了與 JOIN 操作有關(guān)的更多信息,比如說,如果 MySQL 在執(zhí)行這個(gè)查詢時(shí)必須創(chuàng)建一個(gè)臨時(shí)數(shù)據(jù)表,就會(huì)在 extra 列看到 usingtemporary 字樣。
延伸閱讀1:MySQL手冊(cè)bug
在 5.5.31 版本時(shí)人們發(fā)現(xiàn) Oracle 取消了其中的 GPL 協(xié)議,造成了一定的不安。有開發(fā)者在 MySQL 程序臭蟲網(wǎng)站上舉報(bào)這項(xiàng)授權(quán)錯(cuò)誤問題,隨即 MySQL 工程服務(wù)總監(jiān) Yngve Svendsen 在網(wǎng)站上坦言,這的確是一個(gè)文件臭蟲,因?yàn)?man 手冊(cè)程序重新編譯時(shí)套用了錯(cuò)誤的授權(quán)內(nèi)容。不過仍然有人認(rèn)為,Oracle 取消開源授權(quán)改采商業(yè)授權(quán)的“這一天遲早是要到來的”,并尋求其他代替方案。