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