原文連接: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說拜拜了。。。