溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

DB插入性能大亂斗 - postgresql vs mysql vs mongodb vs oracle

發(fā)布時間:2020-08-09 21:09:07 來源:ITPUB博客 閱讀:757 作者:mcszycc 欄目:MySQL數(shù)據(jù)庫
因為看到德哥的postgresql與mongodb插入100萬條記錄的比較文章,想動手驗證一下,但結(jié)論反正讓我看不懂了!

首先我是在虛擬機上測試,4核8G+存儲,centos7.2,mongo3.2.9,postgresql9.6開發(fā)版,都是最新版,新安裝不作任何處理;

都通過python來測試,但mongodb的測試結(jié)果是371秒,跟德哥的測試接近;
可pg就奇怪了,跑了十幾分鐘,還只看記錄達到56萬,實在是慢得出奇;

我估計存儲方面有限制或者開發(fā)版有BUG吧,換物理機來測;
硬件,普通PC機,win10系統(tǒng):
DB插入性能大亂斗 -  postgresql vs mysql vs mongodb vs oracle
PG,之前官網(wǎng)下載的9.5.2windows版,全新安裝不作任何設(shè)置:
DB插入性能大亂斗 -  postgresql vs mysql vs mongodb vs oracle

DB插入性能大亂斗 -  postgresql vs mysql vs mongodb vs oracle
這下能跑完了,但239秒跟德哥的測試有些差距,腳本中有一個區(qū)別,就是不是unix_socket連接(搞不清unix_socket連接名稱在哪找);

由于mongodb還沒裝,但有一個很早之前下載的mysql綠色版,版本號都6.0.5了,非官方,但能用:
DB插入性能大亂斗 -  postgresql vs mysql vs mongodb vs oracle
小測一把,竟然102秒就跑完了?。ê髞砦矣衷谔摂M機上安裝了mariadb5.5.50,測試結(jié)果也是102秒?。?br /> DB插入性能大亂斗 -  postgresql vs mysql vs mongodb vs oracle

這是PG的測試腳本:
import psycopg2
import time
conn=psycopg2.connect(database="test1",user="postgres",password="",host="127.0.0.1",port="5432")
cur=conn.cursor()
conn.autocommit=True
start_t=time.time()
print("START:"+str(start_t))
for i in range(0,1000000):
  cur.execute("insert into tt values(%(id)s,'digoal.zhou',32,'digoal@126.com','276732431')",{"id":i})
stop_t=time.time()
print("STOP:"+str(stop_t))
print(stop_t-start_t)

這是MySQL的測試腳本:
import MySQLdb
import time
conn=MySQLdb.connect(host="localhost",user="root",passwd="",db="test")
cur=conn.cursor()
conn.autocommit=True
start_t=time.time()
print("START:"+str(start_t))
for i in range(0,1000000):
  cur.execute("insert into tt values(%s,%s,%s,%s,%s)",(i,"digoal.zhou",32,"digoal@126.com","276732431"))
stop_t=time.time()
print("STOP:"+str(stop_t))
print(stop_t-start_t)

統(tǒng)一建表腳本(這個腳本在oracle,mysql,pg都能跑):
create table tt(id int, username varchar(20), age int, email varchar(20), qq varchar(20))

mongodb測試結(jié)果(mongodb3.2.9windows版,pymongo):
DB插入性能大亂斗 -  postgresql vs mysql vs mongodb vs oracle
297秒,比虛擬機的成績要好,看來我這機器性能還是不錯的^_^

由于機器上安裝有oracle12.1,所以就來加入戰(zhàn)局,DB大亂斗:
沒想到測試結(jié)果竟然是368秒!附測試結(jié)果(python+cx_Oracle):
DB插入性能大亂斗 -  postgresql vs mysql vs mongodb vs oracle

這下怎么解釋啊,坦率地說,內(nèi)心里面 對O偏愛>PG>mysql,但是被mysql實力打臉了^_^

分析oracle的原因,看來主要還是自動提交比較耗時,但問題是其他DB也是自動提交啊

plsql中,單次提交的效果,244秒與PG差不多:
DB插入性能大亂斗 -  postgresql vs mysql vs mongodb vs oracle

改成批量提交后85秒:
DB插入性能大亂斗 -  postgresql vs mysql vs mongodb vs oracle

不過如果oracle”火力全開“的話,最好成績是1.28秒,當然,這個僅供參考,更公平的還是普通的寫法:
DB插入性能大亂斗 -  postgresql vs mysql vs mongodb vs oracle


在虛擬機上,用python測試插入100萬記錄竟然用了3001秒!暫時想不通原因,用plpgsql測試一把,只要5秒鐘,找回了一點信心:
DB插入性能大亂斗 -  postgresql vs mysql vs mongodb vs oracle

plpgsql代碼:
create or replace function pgins2(num bigint) returns bigint AS $$
declare 
    ii integer;
    beg_tm timestamp;
    end_tm timestamp;
    time_consuming bigint ;  
  begin
II:=1;
beg_tm:=now();
FOR ii IN 1..num LOOP
insert into tt values(ii,'digoal.zhou',32,'digoal@126.com','276732431');
end loop;
end_tm:=now();
select round(EXTRACT(EPOCH from end_tm)-EXTRACT(EPOCH from beg_tm)) into time_consuming;  
    return time_consuming;  
  end;
$$ LANGUAGE plpgsql;

2017-02-21更新:

再次在虛擬機上測試了PG9.2.8與最新的9.6.2正式版,如果自動提交打開的話,都需要2500多秒,而在同一臺機上,mariadb只要159秒;
但當把自動提交關(guān)掉,變成插入后一次提交之后,PG9.6也只用了129秒:
DB插入性能大亂斗 -  postgresql vs mysql vs mongodb vs oracle
這才是比較正常的結(jié)果,為什么虛擬機上與物理機在自動提交模式上差異這么大,也許跟PG的事務(wù)特性有關(guān);

為了公平起見,又對maria_db的腳本也去掉了自動提交,再跑了一次:
DB插入性能大亂斗 -  postgresql vs mysql vs mongodb vs oracle

感覺mariadb對于自動提交與非自動提交并沒有太大的差別,也許本身就作了優(yōu)化吧;

總而言之,我覺得PG與MYSQL的表現(xiàn)都很好了;
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI