PostgreSQL與MySQL比較
本帖最後由 osdba 於 2011-04-21 16:33 編輯
MySQL相對於PostgreSQL的劣勢:
PostgreSQL主要優勢:
1. PostgreSQL完全免費,而且是BSD協議,如果你把PostgreSQL改一改,然後再拿去賣錢,也沒有人管你,這一點很重要,這表明了PostgreSQL資料庫不會被其它公司控制。oracle資料庫不用說了,是商業資料庫,不開放。而MySQL資料庫雖然是開源的,但現在隨著SUN被oracle公司收購,現在基本上被oracle公司控制,其實在SUN被收購之前,MySQL中最重要的InnoDB引擎也是被oracle公司控制的,而在MySQL中很多重要的資料都是放在InnoDB引擎中的,反正我們公司都是這樣的。所以如果MySQL的市場範圍與oracle資料庫的市場範圍衝突時,oracle公司必定會犧牲MySQL,這是毫無疑問的。
2. 與PostgreSQl配合的開源軟體很多,有很多分散式叢集軟體,如pgpool、pgcluster、slony、plploxy等等,很容易做讀寫分離、負載均衡、資料水平拆分等方案,而這在MySQL下則比較困難。
3. PostgreSQL原始碼寫的很清晰,易讀性比MySQL強太多了,懷疑MySQL的原始碼被混淆過。所以很多公司都是基本PostgreSQL做二次開發的。
4. PostgreSQL在很多方面都比MySQL強,如複雜SQL的執行、儲存過程、觸發器、索引。同時PostgreSQL是多程式的,而MySQL是執行緒的,雖然併發不高時,MySQL處理速度快,但當併發高的時候,對於現在多核的單臺機器上,MySQL的總體處理效能不如PostgreSQL,原因是MySQL的執行緒無法充分利用CPU的能力。
目前只想到這些,以後想到再新增,歡迎大家拍磚。
PostgreSQL與oracle或InnoDB的多版本實現的差別
PostgreSQL與oracle或InnoDB的多版本實現最大的區別在於最新版本和歷史版本是否分離儲存,PostgreSQL不分,而oracle和InnoDB分,而innodb也只是分離了資料,索引本身沒有分開。
PostgreSQL的主要優勢在於:
1. PostgreSQL沒有回滾段,而oracle與innodb有回滾段,oracle與Innodb都有回滾段。對於oracle與Innodb來說,回滾段是非常重要的,回滾段損壞,會導致資料丟失,甚至資料庫無法啟動的嚴重問題。另由於PostgreSQL沒有回滾段,舊資料都是記錄在原先的檔案中,所以當資料庫異常crash後,恢復時,不會象oracle與Innodb資料庫那樣進行那麼複雜的恢復,因為oracle與Innodb恢復時同步需要redo和undo。所以PostgreSQL資料庫在出現異常crash後,資料庫起不來的機率要比oracle和mysql小一些。
2. 由於舊的資料是直接記錄在資料檔案中,而不是回滾段中,所以不會象oracle那樣經常報ora-01555錯誤。
3. 回滾可以很快完成,因為回滾並不刪除資料,而oracle與Innodb,回滾時很複雜,在事務回滾時必須清理該事務所進行的修改,插入的記錄要刪除,更新的記錄要更新回來(見row_undo函式),同時回滾的過程也會再次產生大量的redo日誌。
4. WAL日誌要比oracle和Innodb簡單,對於oracle不僅需要記錄資料檔案的變化,還要記錄回滾段的變化。
PostgreSQL的多版本的主要劣勢在於:
1、最新版本和歷史版本不分離儲存,導致清理老舊版本需要作更多的掃描,代價比較大,但一般的資料庫都有高峰期,如果我們合理安排VACUUM,這也不是很大的問題,而且在PostgreSQL9.0中VACUUM進一步被加強了。
2、由於索引中完全沒有版本資訊,不能實現Coverage index scan,即查詢只掃描索引,直接從索引中返回所需的屬性,還需要訪問表。而oracle與Innodb則可以;
程式模式與執行緒模式的對比
PostgreSQL和oracle是程式模式,MySQL是執行緒模式。
程式模式對多CPU利用率比較高。
程式模式共享資料需要用到共享記憶體,而執行緒模式資料本身就是在程式空間內都是共享的,不同執行緒訪問只需要控制好執行緒之間的同步。
執行緒模式對資源消耗比較少。
所以MySQL能支援遠比oracle多的更多的連線。
對於PostgreSQL的來說,如果不使用連線池軟體,也存在這個問題,但PostgreSQL中有優秀的連線池軟體軟體,如pgbouncer和pgpool,所以通過連線池也可以支援很多的連線。
堆表與索引組織表的的對比
Oracle支援堆表,也支援索引組織表
PostgreSQL只支援堆表,不支援索引組織表
Innodb只支援索引組織表
索引組織表的優勢:
表內的資料就是按索引的方式組織,資料是有序的,如果資料都是按主鍵來訪問,那麼訪問資料比較快。而堆表,按主鍵訪問資料時,是需要先按主鍵索引找到資料的物理位置。
索引組織表的劣勢:
索引組織表中上再加其它的索引時,其它的索引記錄的資料位置不再是物理位置,而是主鍵值,所以對於索引組織表來說,主鍵的值不能太大,否則佔用的空間比較大。
對於索引組織表來說,如果每次在中間插入資料,可能會導致索引分裂,索引分裂會大大降低插入的效能。所以對於使用innodb來說,我們一般最好讓主鍵是一個無意義的序列,這樣插入每次都發生在最後,以避免這個問題。
由於索引組織表是按一個索引樹,一般它訪問資料塊必須按資料塊之間的關係進行訪問,而不是按物理塊的訪問資料的,所以當做全表掃描時要比堆錶慢很多,這可能在OLTP中不明顯,但在資料倉儲的應用中可能是一個問題。
PostgreSQL9.0中的特色功能:
PostgreSQL中的Hot Standby功能
也就是standby在應用日誌同步時,還可以提供只讀服務,這對做讀寫分離很有用。這個功能是oracle11g才有的功能。
PostgreSQL非同步提交(Asynchronous Commit)的功能:
這個功能oracle中也是到oracle11g R2才有的功能。因為在很多應用場景中,當當機時是允許丟失少量資料的,這個功能在這樣的場景中就特別合適。在PostgreSQL9.0中把synchronous_commit設定為false就開啟了這個功能。需要注意的是,雖然設定為了非同步提交,當主機當機時,PostgreSQL只會丟失少量資料,非同步提交併不會導致資料損壞而資料庫起不來的情況。MySQL中沒有聽說過有這個功能。
PostgreSQL中索引的特色功能:
MySQL相對於PostgreSQL的劣勢:
PostgreSQL主要優勢:
1. PostgreSQL完全免費,而且是BSD協議,如果你把PostgreSQL改一改,然後再拿去賣錢,也沒有人管你,這一點很重要,這表明了PostgreSQL資料庫不會被其它公司控制。oracle資料庫不用說了,是商業資料庫,不開放。而MySQL資料庫雖然是開源的,但現在隨著SUN被oracle公司收購,現在基本上被oracle公司控制,其實在SUN被收購之前,MySQL中最重要的InnoDB引擎也是被oracle公司控制的,而在MySQL中很多重要的資料都是放在InnoDB引擎中的,反正我們公司都是這樣的。所以如果MySQL的市場範圍與oracle資料庫的市場範圍衝突時,oracle公司必定會犧牲MySQL,這是毫無疑問的。
2. 與PostgreSQl配合的開源軟體很多,有很多分散式叢集軟體,如pgpool、pgcluster、slony、plploxy等等,很容易做讀寫分離、負載均衡、資料水平拆分等方案,而這在MySQL下則比較困難。
3. PostgreSQL原始碼寫的很清晰,易讀性比MySQL強太多了,懷疑MySQL的原始碼被混淆過。所以很多公司都是基本PostgreSQL做二次開發的。
4. PostgreSQL在很多方面都比MySQL強,如複雜SQL的執行、儲存過程、觸發器、索引。同時PostgreSQL是多程式的,而MySQL是執行緒的,雖然併發不高時,MySQL處理速度快,但當併發高的時候,對於現在多核的單臺機器上,MySQL的總體處理效能不如PostgreSQL,原因是MySQL的執行緒無法充分利用CPU的能力。
目前只想到這些,以後想到再新增,歡迎大家拍磚。
PostgreSQL與oracle或InnoDB的多版本實現的差別
PostgreSQL與oracle或InnoDB的多版本實現最大的區別在於最新版本和歷史版本是否分離儲存,PostgreSQL不分,而oracle和InnoDB分,而innodb也只是分離了資料,索引本身沒有分開。
PostgreSQL的主要優勢在於:
1. PostgreSQL沒有回滾段,而oracle與innodb有回滾段,oracle與Innodb都有回滾段。對於oracle與Innodb來說,回滾段是非常重要的,回滾段損壞,會導致資料丟失,甚至資料庫無法啟動的嚴重問題。另由於PostgreSQL沒有回滾段,舊資料都是記錄在原先的檔案中,所以當資料庫異常crash後,恢復時,不會象oracle與Innodb資料庫那樣進行那麼複雜的恢復,因為oracle與Innodb恢復時同步需要redo和undo。所以PostgreSQL資料庫在出現異常crash後,資料庫起不來的機率要比oracle和mysql小一些。
2. 由於舊的資料是直接記錄在資料檔案中,而不是回滾段中,所以不會象oracle那樣經常報ora-01555錯誤。
3. 回滾可以很快完成,因為回滾並不刪除資料,而oracle與Innodb,回滾時很複雜,在事務回滾時必須清理該事務所進行的修改,插入的記錄要刪除,更新的記錄要更新回來(見row_undo函式),同時回滾的過程也會再次產生大量的redo日誌。
4. WAL日誌要比oracle和Innodb簡單,對於oracle不僅需要記錄資料檔案的變化,還要記錄回滾段的變化。
PostgreSQL的多版本的主要劣勢在於:
1、最新版本和歷史版本不分離儲存,導致清理老舊版本需要作更多的掃描,代價比較大,但一般的資料庫都有高峰期,如果我們合理安排VACUUM,這也不是很大的問題,而且在PostgreSQL9.0中VACUUM進一步被加強了。
2、由於索引中完全沒有版本資訊,不能實現Coverage index scan,即查詢只掃描索引,直接從索引中返回所需的屬性,還需要訪問表。而oracle與Innodb則可以;
程式模式與執行緒模式的對比
PostgreSQL和oracle是程式模式,MySQL是執行緒模式。
程式模式對多CPU利用率比較高。
程式模式共享資料需要用到共享記憶體,而執行緒模式資料本身就是在程式空間內都是共享的,不同執行緒訪問只需要控制好執行緒之間的同步。
執行緒模式對資源消耗比較少。
所以MySQL能支援遠比oracle多的更多的連線。
對於PostgreSQL的來說,如果不使用連線池軟體,也存在這個問題,但PostgreSQL中有優秀的連線池軟體軟體,如pgbouncer和pgpool,所以通過連線池也可以支援很多的連線。
堆表與索引組織表的的對比
Oracle支援堆表,也支援索引組織表
PostgreSQL只支援堆表,不支援索引組織表
Innodb只支援索引組織表
索引組織表的優勢:
表內的資料就是按索引的方式組織,資料是有序的,如果資料都是按主鍵來訪問,那麼訪問資料比較快。而堆表,按主鍵訪問資料時,是需要先按主鍵索引找到資料的物理位置。
索引組織表的劣勢:
索引組織表中上再加其它的索引時,其它的索引記錄的資料位置不再是物理位置,而是主鍵值,所以對於索引組織表來說,主鍵的值不能太大,否則佔用的空間比較大。
對於索引組織表來說,如果每次在中間插入資料,可能會導致索引分裂,索引分裂會大大降低插入的效能。所以對於使用innodb來說,我們一般最好讓主鍵是一個無意義的序列,這樣插入每次都發生在最後,以避免這個問題。
由於索引組織表是按一個索引樹,一般它訪問資料塊必須按資料塊之間的關係進行訪問,而不是按物理塊的訪問資料的,所以當做全表掃描時要比堆錶慢很多,這可能在OLTP中不明顯,但在資料倉儲的應用中可能是一個問題。
PostgreSQL9.0中的特色功能:
PostgreSQL中的Hot Standby功能
也就是standby在應用日誌同步時,還可以提供只讀服務,這對做讀寫分離很有用。這個功能是oracle11g才有的功能。
PostgreSQL非同步提交(Asynchronous Commit)的功能:
這個功能oracle中也是到oracle11g R2才有的功能。因為在很多應用場景中,當當機時是允許丟失少量資料的,這個功能在這樣的場景中就特別合適。在PostgreSQL9.0中把synchronous_commit設定為false就開啟了這個功能。需要注意的是,雖然設定為了非同步提交,當主機當機時,PostgreSQL只會丟失少量資料,非同步提交併不會導致資料損壞而資料庫起不來的情況。MySQL中沒有聽說過有這個功能。
PostgreSQL中索引的特色功能:
PostgreSQL中可以有部分索引,也就是隻能表中的部分資料做索引,create index 可以帶where 條件。同時PostgreSQL中的索引可以反向掃描,所以在PostgreSQL中可以不必建專門的降序索引了。
轉載: http://bbs.chinaunix.net/thread-1688208-1-1.html
相關文章
- PostgreSQL與MySQL的比較 - hackrMySql
- 360°全方位比較PostgreSQL和MySQLMySql
- PostgreSQL與Rust的聚合實現比較SQLRust
- PostgreSQL、Redis與Memcached的效能比較 - CYBERTECSQLRedis
- mysql中count(1)與count(*)比較MySql
- 關聯式資料庫比較:SQLite vs MySQL vs PostgreSQL資料庫SQLiteMySql
- Mysql中的Btree與Hash索引比較MySql索引
- 資料庫比較 PostgreSQL vs MongoDB資料庫SQLMongoDB
- PostgreSQL初體驗及其與MySQL的對比MySql
- OceanBase簡介及其與MySQL的比較MySql
- MySQL中MyISAM引擎與InnoDB引擎效能比較MySql
- MongoDB和MySQL比較MongoDBMySql
- MySQL:MySQL層比較函式呼叫MySql函式
- Oracle與PostgreSQL比較:PostgreSQL至少在安裝和大小方面擊敗了Oracle - foersterOracleSQL
- Vue與React比較VueReact
- 【Redis與Memcached比較】Redis
- RecyclerView與ListView比較View
- js與jq比較JS
- Vuex與Redux比較VueRedux
- 比較MySQL 5.6與前版的同步協議薦MySql協議
- 【.NET 6】使用EF Core 訪問Oracle+Mysql+PostgreSQL並進行簡單增改操作與效能比較OracleMySql
- 使用perl比較mysql的版本MySql
- mysql timestamp比較查詢MySql
- mysql字元型別varchar()比較MySql字元型別
- React與Vue模板使用比較(一、vue模板與React JSX比較)ReactVueJS
- MySQL大量資料插入各種方法效能分析與比較MySql
- Flutter 與 iOS 功能比較FlutteriOS
- Flutter與Swift比較 - evroneFlutterSwiftVR
- Hibernate與mybatis比較MyBatis
- Python 與 Javascript 比較PythonJavaScript
- PostgreSQL 原始碼解讀(196)- 浮點數比較SQL原始碼
- MySQL中的NULL和空串比較MySqlNull
- mysql比較兩個日期間隔MySql
- MySql 時間比較:DATEDIFF函式與大於小於號MySql函式
- oracle Mysql PostgreSQL 資料庫的對比OracleMySql資料庫
- JavaScript與WebAssembly進行比較JavaScriptWeb
- MVVM與MVC模式的比較MVVMMVC模式
- Spring Boot與Micronaut比較Spring Boot