選擇pgsql還是mysql?

2021-01-14 算法與數據挖掘

引言:

關係型資料庫的使用場景中,mysql這麼好用,為什麼要考慮pgsql?

看完這篇文章也許你會有不同的想法。

概述:

mysql出現在1994年,現在所有權歸屬oracle,創始人現在又發布了新的免費開源資料庫MariaDB,現在開源關係型資料庫領域,mysql使用確實是最廣泛的,官方說許多世界上最大、發展最快的組織都在使用mysql。

pgsql又稱PostgresSQL,出現在1986年,官方標榜自己是世界上最先進最高級的開源關係型資料庫。

pgsql和mysql簡介:

pgsql的一些粉絲說可以跟oracle相媲美,可靠性是pgsql的最高優先級,數據一致性與完整性也是pgsql的高優先級特性;

mysql和pgsql都出現在一些高流量的web站點上,都能用在大型分布式系統上,都支持事務,都支持全文索引;

mysql現在已經支持嵌入式應用,而pgsql依然堅守在傳統B/S架構上;

mysql能夠進行快速的讀取和大量的查詢操作,不過在複雜特性與數據完整性檢查方面不太盡如人意;

pgsql是針對事務性企業級應用嚴肅、功能完善的資料庫,支持強ACID特性,會做很多數據完整性檢查;

mysql上myISAM存儲引擎因為執行很少的數據完整性檢查,所以速度快,對於敏感數據,對讀寫要求高的數據,支持 ACID特性的InnoDB則是個更好的選擇,相反pgsql是個只有單一存儲引擎完全集成的資料庫;

mysql與pgsql都是高可配置的,通過參數調整性能,也可以調整查詢與事務特性,他們都支持通過擴展添加額外的功能;

pgsql可靠性更好,穩定性很強,在保護數據安全方面更擅長,並且是社區項目,不會陷入商業廠商牢籠之中;

mysql的普及更廣一些,學習資料更多,熟練使用的人更多,所以選擇mysql的企業很多。

pgsql相比mysql的優勢:

pgsql存儲過程的功能支持要比mysql好,具備本地緩存執行計劃的能力;

pgsql對表連接支持更完整,優化器的功能更完整,支持的索引類型很多,複雜查詢能力較強;

pgsql主備複製屬於物理複製,支持異步、同步、半同步複製,mysql基於binlog的邏輯複製,是異步複製,pgsql數據的一致性更加可靠,複製性能更高,對主機性能的影響也更小;

pgsql支持json數據類型,而mysql不支持,mysql字符型有長度限制,而pgsql的text類型無限長,可以使用xml xpath,用pgsql的話,mongodb這樣文檔資料庫就省了;

pgsql是完全免費開源的,而mysql歸屬oracle後,開源程度大不如以前;

pgsql在GIS領域多年來處於優勢地位,有豐富的幾何類型,支持極其豐富的空間函數,可以建立R樹、GIST樹等空間索引,instagram就是因為pgsql的空間資料庫擴展postgis遠遠強於mysql的my spatial而採用的pgsql;

pgsql有極其強悍的sql編程能力,有非常豐富的統計函數和統計語法支持,可用多種語言寫存儲過程,對R支持也非常好,這一點mysql就差的很遠,騰訊內部數據存儲主要用mysql,但是數據分析主要是hadoop+pgsql;

pgsql有多種集群架構可選擇,plproxy可以支持語句級的鏡像或分片,slony可以進行欄位級的同步設置,standby可以構建WAL文件級或流式的讀寫分離集群,同步頻率和集群策略調整方便,操作非常簡單;

pgsql支持topology、pgrouting等功能強大、方便使用的GIS擴展,例如可以用pgrouting計算路徑規劃;

pgsql資料庫方便QGIS等GIS工具連接和圖層展示等操作;

下圖是用QGIS從pgsql讀取數據並展示圖層:

mysql相比pgsql的優勢:

mysql採用索引組織表,這種存儲方式非常適合基於主鍵匹配的查詢、刪改操作,但是對表結構設計存在約束;

mysql的優化器較簡單,系統表、運算符、數據類型的實現都很精簡,非常適合簡單的查詢操作;

mysql分區表的實現要優於pgsql的基於繼承表的分區實現,主要體現在分區個數達到上千上萬後的處理性能差異較大;

mysql的存儲引擎插件化機制,使得它的應用場景更加廣泛,比如除了Innodb適合事務處理場景外,Myisam適合靜態數據的查詢場景;

mysql也支持空間索引,是用R樹實現的空間索引,但空間函數等功能不如pgsql豐富,空間查詢比pgsql慢;

pgsql更適合嚴格的企業應用場景,比如金融、電信、ERP、CRM等,mysql更適用業務邏輯相對簡單、數據可靠性要求更低的網際網路場景,比如google、facebook、淘寶等。

一個簡單的性能對比:

下圖是redis、mongo、pgsql、mysql在一個空間查詢場景下的對比:

pgsql支持的幾種高級插件:

postgis提供豐富的空間數據類型和空間函數。

pgrouting 用來進行路徑規劃。

postgis_topology 用於管理點、線、面等拓撲對象。

postgis_sfcgal 用於實現3D相關算法。

fuzzystrmatch 字符串相似度計算。

address_standardizer 用於地址標準化。

pg_trgm 用於分詞索引。

結論:

如果空間操作比較多,比較複雜,那就得選擇pgsql;

如果對數據安全性和穩定性要求很高,pgsql是更好的選擇;

如果業務場景沒那麼複雜,mysql完全可以勝任。

希望這篇文章對你有所幫忙,歡迎留言討論。

相關焦點

  • MySQL - mysqldump常用命令 - linux運維菜
    ,不備份數據mysqldump -uroot -ppassword -A -d > database.sql3、只備份資料庫,不備份表結構mysqldump -uroot -ppassword -A -t > data.sql
  • 問答:學SQL Server好還是學MySQL好?
    那麼既然是想通的,為什麼推薦用mysql呢?1.mysql體積小,環境安裝更方便。而SQLserver安裝包比較大,安裝麻煩。可以看到SQLserver2016的安裝包2.28G,不光安裝包大,安裝起來的步驟也非常費勁,還容易出錯,而mysql安裝就簡單多了。環境配置是必不可少的配置,總不能說我會用這個,但是環境我不會配置吧。
  • mysql學習詳記一&&什麼是mysql資料庫?
    一、什麼是mysql資料庫1、資料庫的概念資料庫: 存儲數據的倉庫資料庫類型:層次式資料庫, 網絡式資料庫, 關係型資料庫3、常見資料庫商業資料庫:Oracle、SQLServer、DB2、Sybase開源資料庫:MySQL、SQLLite、orientdb4、MySQL資料庫的安裝和配置參考上一篇文章 mysql-mysql
  • 免安裝版MySQL操作步驟
    1、 修改mysql安裝目錄下的my.ini文件a) 將Mysql的壓縮包先解壓,解壓後mysql安裝目錄下有如下的文件和文件夾:b) 打開my.ini文件(可以用記事本打開)>a) 將mysql安裝目錄中的bin文件夾的目錄,寫入系統變量path中3、 將mysql設置為服務a) 使用管理員權限進入dos命令窗口i. 「 如何以管理員身份進入dos命令窗口?
  • mysql學習詳記六&&關鍵字執行順序&mysql內置函數
    注意:雖然select在having後執行,但是mysql中仍然可以在having中使用select語句定義的別名。原因分析:mysql在查詢的時候會產生一個臨時表,所有的欄位名稱(別名)在臨時表中已經產生,產生了臨時表之後才會進行having操作。
  • 網際網路公司常用MySql架構
    對應的文件夾2.3 刪除mysql對應的文件夾2.4 下載mysql安裝程序2.5 解壓mysql安裝程序2.6 添加用戶和組2.7 安裝資料庫三、修改MySQL配置db1,db2,db3 三臺主機上分別建立如下目錄mkdir /var/log/mysql && chown -R mysql:mysql /var/log/mysql/3.1 db1配置3.2 db2配置
  • Centos7 安裝MySQL 5.7
    在CentOS中默認安裝有MariaDB,這個是MySQL的分支,但為了需要,還是要在系統中安裝MySQL,而且安裝完成之後可以直接覆蓋掉MariaDB。1 下載並安裝MySQL官方的 Yum Repositorywget -i -c http://dev.mysql.com/get/
  • mysql學習詳記四&&資料庫的備份及恢復&&mysql多表設計&外鍵約束
    一、mysql資料庫的備份及恢復備份資料庫表中的數據cmd> mysqldump -u 用戶名 -p 資料庫名 > 文件名.sqlmysqldump -uroot -p db_name > d:/1.sql
  • mysql 常用命令二
    【資料庫回歸與備份】#導出資料庫中表# mysqldump --opt aa>aa.sql;mysqldump --opt aa b c >aa.b.c.sql;//將資料庫aa中的表b和表c備份到文件aa.b.c.sql中#導入表# 1)create database school;
  • OpenResty、PHP-fpm與NodeJs操作MySQL的性能對比
    agentzh:我剛才在對比測試大結果集查詢時,發現NodeJS在使用 node-mysql庫訪問MySQL時,上下文切換次數居高不下,都快趕上 php-fpm + php-mysql了。但Node只起了一個進程,而且 strace 確認了確實是非阻塞的(不像 node-mysql-libmysqlclient 和 node-db-mysql 那樣濫用 OS 線程池玩阻塞通信),很是奇怪
  • MySQL 備份數據那點事
    mysqldump什麼是 mysqldump ?mysqldump 是 MySQL 用於執行邏輯備份的一款工具,可以根據原始資料庫對象以及表的定義和數據來生成一系列可以被執行的 SQL 語句。通常我們用它作為備份或者遷移數據。
  • mysql查詢資料庫導致中文亂碼
    mysql查詢資料庫,如果資料庫裡的欄位的值是中文,就會出現亂碼,怎麼解決呢?看下面的講解寫一個test.php的文檔,代碼如下所示,打開mysql的界面,新建一個xml的資料庫,再建一個student的數據表,欄位值和記錄如下圖所示,打開谷歌瀏覽器,運行test.php文檔。運行結果是下圖:看到了吧,出現亂碼了,怎麼辦呢?
  • SpringBoot + MyBatis + MySQL讀寫分離實踐!
    引言讀寫分離要做的事情就是對於一條SQL該選擇哪個資料庫去執行,至於誰來做選擇資料庫這件事兒,無非兩個,要麼中間件幫我們做,要麼程序自己做。因此,一般來講,讀寫分離有兩種實現方式。第一種是依靠中間件(比如:MyCat),也就是說應用程式連接到中間件,中間件幫我們做SQL分離;第二種是應用程式自己去做分離。
  • mysql常用命令,保存一下,以後查詢方便了
    -u root -password 1234563、修改root用戶密碼為 abc123mysqladmin -u root -p123456 password abc1234、如果想去掉密碼:mysqladmin
  • mysql大表中count()的用法以及mysql中count()的優化
    本篇文章給大家帶來的內容是關於mysql大表中count()的用法以及mysql中count()的優化,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。一個單表中包含有6000w+的數據,然而你又不能拆分.需要分別統計表中有多少數據,A產品有多少,B產品有多少這幾個數據.
  • MySQL優化:學會使用show profile和trace分析慢查詢
    1.2 查看 profiling 狀態mysql> select @@profiling;0表示關閉,1表示開啟,默認是關閉的。使用如下命令開啟:mysql> set profiling=1;1.3 執行要分析的sql語句mysql> select * from test_table where d=90000;執行完成SQL後再執行:show profiles;得到profile id。
  • php怎樣對mysql的數據進行排序?
    在上一篇文章中我們了解了如何進行條件查詢,用where這個關鍵字來實現條件查詢,過濾掉很多我們不需要的信息,大大節省了帶寬,今天我們來學習一下怎樣對mysql的數據進行排序,指定一個排序的規則,比如說我們要根據姓名來排序,或者是根據年齡來排序,這些都是可以通過mysql中的order
  • 關於mysql中運算符與函數的概述
    運算符是告訴mysql執行特定的算術或邏輯操作的符號,運算符連接著各個表達式中的操作數,其作用是用來指明對操作數進行的運算。3.截斷函數:4.取模:mysqlmysql日期時間函數:1.獲取當前日期的函數:
  • MySQL忘記密碼怎麼辦 密碼重置詳細教程
    登錄資料庫修改密碼/*此時可以直接登錄資料庫 無需輸入密碼 */[root@TESTDB ~]# mysql -uroot    -P3306Welcome to the MySQL monitor.
  • mysql 矩陣類型專題及常見問題 - CSDN
    介紹mysql進入mysqlmysql -u root -p-u root 其中 root為用戶名選擇資料庫連接資料庫在連接資料庫之前,確保mysql