[評測]低配環境下,PostgresQL和Mysql讀寫性能簡單對比(歡迎你們提出Mysql優化意見)

 

 

[評測]低配環境下,PostgresQL和Mysql讀寫性能簡單對比

原文連接:https://www.cnblogs.com/blog5277/p/10658426.htmlhtml

原文做者:博客園--曲高終和寡spring

*******************若是你看到這一行,說明爬蟲在本人尚未發佈完成的時候就抓走了個人文章,致使內容不完整,請去上述的原文連接查看原文****************sql

 

因爲最近通過朋友啓發,又有了一個寫我的項目的小想法,在此次我的項目中準備學習並使用一些以前本身沒有掌握的新技術,其中,在項目準備的時候,準備爬一些數據作儲備。數據庫

過去的項目,都對數據寫入沒有硬性要求,因此以前就是寫了爬蟲放那無論了,此次因爲項目的需求,須要大量快速的爬取/複製/寫入數據,我就發現我如今用的Mysql並不能知足個人需求,奇慢無比。通過對比評測,初步決定選用PostgresQL替換掉Mysql。springboot

 

〇:先擺結論服務器

寫入速度:post

Mysql:  8.5/s性能

PostgresQL:   800/s學習

讀取速度:測試

因爲Mysql50W條數據以後反覆出錯,一段時間後就connection reset之類的,因而以PostgresQL100W數據,Mysql57W數據爲基礎作測試

Mysql:

 

PostgresQL:

 結論,不論讀寫,PostgresQL在我這臺機器上顯著優於Mysql,因此我選擇PostgresQL做爲之後的數據庫使用

 

一:前期調查

若是一個市場佔有率小的數據庫(根據谷歌趨勢),口碑/媒體評測/我的評測都不如Mysql的話,那就不用考慮了。

通過調查,不論是百度、谷歌搜出來的絕大部分結果都是PostgresQL強得多,也符合我本身的評測結果。

有一個關於PostgresQL的負面新聞是,Uber從PostgresQL轉爲Mysql,可是通過更多的調查發現,這並不徹底是PostgresQL的問題,好比以下文章:

http://www.sohu.com/a/108363951_465959

https://m.aliyun.com/yunqi/articles/79658

就解釋了這個問題,我我的通過調研是更傾向於PostgresQL的

 

二:準備工做

1.一臺阿里雲服務器,1核2G1M帶寬I/O優化硬盤(應該是SSD)

2.Mysql 5.7,PostgresQL 11(Mysql版本低是由於我看寶塔推薦Mysql 8.0須要有2G內存最好,但是我這辣雞服務器總共內存才2G,因此不考慮8.0,更況且從最後的測試結果來看,我不相信換成8.0能彌補這個差距),所有采用安裝時的默認配置,不作任何優化(由於我不會),這樣也能夠看數據庫自身,最大衆的狀況下的調教能力(在找藉口),兩臺都部署在上述那臺服務器上

3.建表和字段:

字段 Mysql格式 PostgresQL格式
id(uuid) char(36) char(36)
gmt_create datetime timestamp without timezone
gmt_modified datetime timestamp without timezone
content varchar(20) text

在id,gmt_create,content分別加了單索引

說明一下,PostgresQL的text屬性是可無限填數據的,Mysql用的的可變字符varchar(20),而不是longtext,應該已經算優待Mysql了吧

4.數據插入方法:

模擬真實腳本環境,採用springboot+spring-data-jpa 造假數據插入,jpa開啓批量插入設置,並可控制batch大小,通過屢次測試找出最適合數據庫的batch size大小。

爲了不服務器/運行環境資源爭搶,一次只運行單個數據庫的數據插入方法,下面是批量插入核心代碼

 

 

 

三:測試插入

Mysql:

通過測試,Mysql入庫速度大約是每秒10條左右,因此batch大小我設置爲了5。

設置100會致使8秒1插(一開始數據庫數量不多的時候,後面多了確定仍是會降),設置1000會拋異常,鏈接超時/重置/未響應等異常,這裏不是我不給它設置大的,一開始設置了1000它真的扛不住!!!

如下是插入的時候控制檯信息:

如下是workbench裏面篩選1分鐘錄入數據的值:

 這是隻有40多萬數據的時候的值,後面會更慢的,實在是懶得等了先把這部分先寫了,因此得出結論:

 

Mysql的寫入速度爲:510 / 60 = 8  條數據每秒

 

PostgresQL:

通過測試,PostgresQL入庫速度大約爲每秒不到1000條,因此batch大小我設置了500。

如下是插入的時候控制檯信息:

如下是pgadmin裏面篩選1分鐘錄入數據的值:

因此得出結論:

PostgresQL的寫入速度爲:  48000 / 60 = 800  條數據每秒

 

這差距也太大了。。。大到我都不想再測100W條數據後,查數據的速度了。。。

仍是等吧,我等到Mysql龜速插完100W條數據之後再來更新吧

 

 四:查詢速度測試

因爲Mysql在插入50W條數據之後寫入性能急劇降低,而且不停報錯,因此決定終止插入Mysql數據。

就以PostgresQL 100W條數據:

Mysql  57W條數據:

在此基礎上測試

很是簡單的測試場景:

 

 

Mysql:

 

 

 

PostgresQL:

 

解釋一下:postgresql源生的btree索引,不支持中文檢索,致使不論怎麼檢索(‘XXXX%’)它根本不生效,1111條數據返回時間仍爲80000+,因而查了一下,裝了個 pg_trg 組件支持中文索引,結果這個組件太強大了。。。'%XXXX%'也一樣支持觸發索引。

裝組件的方法:

1.centOS服務器下載組件:

sudo yum install postgresql11-contrib

2.在pgadmin,或者pgsql裏面執行(就相似於執行sql那樣)

CREATE EXTENSION pg_trgm;

 

五:一些總結

一開始測試Mysql的插入的時候,我一度懷疑是我安裝Mysql的時候配置出錯了?怎麼可能這麼低!!!

後來測試讀取的時候速度正常,比PostgresQL低的沒有寫入那麼大,才讓我以爲,嗷,原來是PostgresQL厲害。。。

個人本次測試只能說基於我這臺服務器的狀況,而且是模擬個人使用場景(springboot + spring data jpa),可能並無普適性。或許Mysql經過sql腳本導入快得多,但那不是個人使用場景沒有辦法,不公平就不公平吧,我也沒有辦法。

我也歡迎你們提出對Mysql和PostgresQL優化的意見,通過調優以後再作對比。

我相信在高性能服務器上,測試結果(尤爲是寫入),可能Mysql的差距會減少,但這是我我的學習用的服務器,我買不起超高配置的,就只能這樣了,若是Mysql只能有這樣的性能表現,那我只能向Mysql說拜拜了。。。

相關文章
相關標籤/搜索