MongoDB与PostgresQL无责任初步测试

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则用于存那些“又大又傻”的数据。

posted @ 2016-03-23 15:57  guogangj  阅读(8303)  评论(1编辑  收藏  举报