PostgresQL一秒能插入多少條記錄,MongoDB呢?讀取的情況又如何?我寫了一些簡單的程序,得出了一些簡單的數據,貼在這里分享,繼續往下閱讀前請注意下本文標題中的“無責任”,這表示此測試結果不代表真實的生產環境下的情況,只能說給大家一個比較直觀的概念,可用於設計架構時候的估算。(量級上來說應該基本上是正確的)
本次測試選擇的服務器環境為:
- VMWare虛擬機(雙核,4G內存)
- CentOS 7
- MongoDB 3.2
- PostgresQL 9.4
- 客戶端均為Java版
- 單線程客戶端
插入數據比較簡單,PostgresQL中創建這么一張表:
CREATE TABLE realtime( id BIGINT PRIMARY KEY, longtitude DOUBLE PRECISION, latitude DOUBLE PRECISION, velocity DOUBLE PRECISION, soc DOUBLE PRECISION );
對應地,MongoDB中的Document大致如此:
{ "_id" : NumberLong(1458587322), "longitude" : 0.5812149460333115, "latitude" : 0.23716701482457414, "velocity" : 0.9920389498763238, "soc" : 0.6602090307636349 }
數據隨機生成,只有id為索引。
插入100萬條數據
- MongoDB(帶ACK)——約300秒(約3300條/秒)
- MongoDB(無ACK)——約35秒(月28000條/秒)
- PostgresQL——約670秒(約1500條/秒)
不帶ACK的MongoDB的速度大約是PostgresQL的20倍,寫入條目數可輕松破萬。
隨機查詢(無索引,600萬條數據)
- MongoDB——約2秒
- PostgresQL——約0.5秒
這次PostgresQL占優,速度大約是MongoDB的4倍。
順序讀取一萬條數據
- MongoDB——約0.1秒
- PostgresQL——約0.5秒
這次MongoDB占優,速度大約是PostgresQL的5倍。
也許你說MongoDB和PostgresQL是兩種不同截然的數據庫系統啊,干嘛放一起比?我當然知道,所以才拿出來比,(呵呵)比較后才知道什么情況下用什么樣的數據庫,怎么樣才能將其能力發揮到最好嘛,對不對?於是有了下面這些“無責任”的結論(或者說小小建議了):
- PostgresQL功能強大通用性好可靠性高適用面廣(嗯?我的測試並未反映出這點啊?請執行忽略掉這些細節)
- MongoDB適合於邏輯簡單,存儲量大,性能要求高,而可靠性要求相對不高的場合
- 存儲量巨大的情況下,MongoDB的查詢必須得依賴索引
- MongoDB的索引越少性能越好,磁盤空間消耗越少(索引能不要就不要),和前一點做一些自我平衡吧
實際的情況會有哪些不同?實際中性能肯定是要比這個高的,我這次只是用了一台本地的虛擬機用單線程訪問嘗試了一下,真實環境下的話肯定是高配置的服務器主機加多線程。一般來說關系型數據庫(PostgresQL這種)在單台主機上的表現確實存在一個性能瓶頸,每秒寫入萬條對關系型數據庫來說就很吃力,如果遇到了這個瓶頸,就可以考慮調整系統架構,使用NoSQL(MongoDB這種)分攤一些數據存儲了,當然了,邏輯復雜,事務性要求高的數據還是得用PostgresQL,MongoDB則用於存那些“又大又傻”的數據。