一直好奇于MongoDB的读写速度以及它的特有的NoSQL查询机制。有幸作了一次Sybase ASA(SQLAnywhere12)和MongoDB写入数据行的速度的比较。
这对于大规模Web访问来说,非常重要。
比较基准:
写入100000行,每行三列,id(整数), name varchar(32), col_blob或clob,8K左右长度。比较最终的写入时间。
1. ASA12:
dbinit.exe bench.db
dbeng12.exe bench.db
代码如下:
package com.sql9;
import java.sql.*;
import java.util.Properties;
public class Bench4SQLAnywhere
{
// prepare about 100000 rows of data
// (id, name, col_clob)
// e.g. (1, 'wang', 'abcdef12345555555555555555555555555555555555555555555....')
// the col_blob should be 8K or longer.
// dsn: benchASA
public static final String DSN = "bench_ASA";
public static final String url = "jdbc:sqlanywhere:UserID=dba;Password=sql;Server=bench;DBN=bench";
public static void testWrite()
{
Connection conn = null;
System.out.println("begin time: " + new Timestamp(new java.util.Date().getTime()));
// System.setProperty("java.library.path", "v:/target/ASA120/Bin32");
try
{
Properties props = new Properties();
props.put("DYNAMIC_PREPARE", true);
conn = DriverManager.getConnection("jdbc:sqlanywhere:DSN=" + DSN + ";uid=dba;pwd=sql", props);
// conn = DriverManager.getConnection(url, props);
Statement stmt = conn.createStatement();
stmt.executeUpdate("create table t(id int primary key, name varchar(32) null, col_blob long varchar null)");
stmt.close();
stmt = null;
PreparedStatement pstmt = conn.prepareStatement("insert into t values(?, ?, ?)");
StringBuilder sb = new StringBuilder(8000);
for (int i=0; i<800; i++)
{
sb.append("abcde12345");
}
for (int i=0; i<100000; i++)
{
pstmt.setInt(1, i+1);
pstmt.setString(2, "wang " + i);
pstmt.setString(3, sb.toString());
pstmt.executeUpdate();
if ((i+1) % 1000 == 0)
{
conn.commit();
}
}
conn.commit();
pstmt.close();
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
// if conn not null, just drop the table ????
}
System.out.println("end time: " + new Timestamp(new java.util.Date().getTime()));
try
{
if (conn != null)
{
Statement stmt = conn.createStatement();
stmt.executeUpdate("drop table t");
stmt.close();
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
if (conn != null)
{
try
{
conn.close();
}
catch (Exception ex2) {}
}
}
}
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
testWrite();
}
/**
* result
* begin time: 2012-04-12 17:44:22.292
end time: 2012-04-12 17:55:16.971
*/
}
我们可以看到最终结果: begin time: 2012-04-12 17:44:22.292 end time: 2012-04-12 17:55:16.971, 大概花了11分钟。是够慢的。运行时需要指定-Djava.library.path=<asa12>/bin32目录。2. MongoDB:
启动:mongod.exe --dbpath E:\xionghe\MongoDB\mongodb\data
客户端简单命令:
db.testCollection.count()
代码如下:
package com.sql9;
import java.net.UnknownHostException;
import java.sql.Timestamp;
import java.util.HashMap;
import com.mongodb.Mongo;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.DBCursor;
import com.mongodb.MongoException;
public class Bench4MongoDB
{
public static void testWrite() throws UnknownHostException, MongoException
{
Mongo m = new Mongo();
// or
// Mongo m = new Mongo( "localhost" );
// or
// Mongo m = new Mongo( "localhost" , 27017 );
System.out.println("begin time: " + new Timestamp(new java.util.Date().getTime()));
DB db = m.getDB( "test" );
StringBuilder sb = new StringBuilder(8000);
for (int i=0; i<800; i++)
{
sb.append("abcde12345");
}
// on row looks like
DBCollection col = db.getCollection("testCollection");
for (int i=0; i<100000; i++)
{
// pstmt.setInt(1, i+1);
// pstmt.setString(2, "wang " + i);
// pstmt.setString(3, sb.toString());
// pstmt.executeUpdate();
// if ((i+1) % 1000 == 0)
// {
// conn.commit();
// }
BasicDBObject doc = new BasicDBObject();
doc.put("id", i);
doc.put("name", "wang " + i);
doc.put("col_blob", sb.toString());
// col.insert(doc);
col.save(doc);
}
System.out.println("end time: " + new Timestamp(new java.util.Date().getTime()));
// finally remove the col1 from the mongoDB.
// col.remove(new BasicDBObject(new HashMap()));
}
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
try
{
testWrite();
}
catch (UnknownHostException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (MongoException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
begin time: 2012-04-12 18:11:18.99
end time: 2012-04-12 18:11:44.412
*/
}
看看所花时间:begin time: 2012-04-12 18:11:18.99end time: 2012-04-12 18:11:44.412只花了: 26秒左右。我只能说差距太明显了。。。。。。。
再看看生成的文件大小:bench.db: 814,900KB, .log: 819328KB.mongodb的testdb: test.* (test.0, ... test.5)共6个文件1,073,479,685B也就1G左右。
分析:
ASA之所以慢如此之多,一是它基于关系表,有一个BLOB/CLOB字段要跨页存储,同时它要维护主键的索引。MongoDB则没有维护索引。可能对
testCollection创建一个索引,再进行比较更合理一些,但我有理由相信,即算加上索引,MongoDB也比ASA要快很多。
看来,MongoDB适用于互联网所言非虚。
不过,我再看了下MongoDB的license:
是一个开放源码项目,其数据库基于 GNU AGPL (Affero General Public License) version 3.0 的许可。此许可是 GNU GPL 的一个修正版,它弥补了版权限制不适用于软件使用而仅适用软件分发的漏洞。这对于在云中存储而不经常安装在客户端设备上的软件当然是重要的。使用常规 GPL ,您会感觉到实际上无法进行分发,因此潜在地规避了许可条款。
AGPL 只适用于它自己的数据库应用程序,不适用于 MongoDB 的其他组成部分。允许开发人员从各种编程语言连接 MongoDB 的官方驱动程序在 Apache License Version 2.0 许可下分发。 MongoDB 文档的使用基于 Creative Commons 许可。
这是否意味着,如果我要开发一款基于Cloud的大型互联网应用,可以直接使用MongoDB和自己的产品集成,而没有任何法律风险?
有熟悉此道的朋友,请告诉我。。。
<script type="text/javascript"><!--
google_ad_client = "ca-pub-7104628658411459";
/* wide1 */
google_ad_slot = "8564482570";
google_ad_width = 728;
google_ad_height = 90;
//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
分享到:
相关推荐
MongoDB是一种流行的开源、分布式文档数据库,常被用于构建高性能、可扩展的应用程序。这个“mongodb-测试数据”压缩包显然包含了一些...通过深入研究和操作这些数据,你可以增强对MongoDB的理解,提升数据库管理技能。
在此次性能对比测试中,bankmarkUG使用了Yahoo Cloud Serving Benchmark(YCSB)作为测试平台,目的是为了比较SequoiaDB、Cassandra和MongoDB在不同工作负载场景下的性能表现。YCSB是一个用于评估云存储系统中数据库...
在IT行业中,数据库管理系统(DBMS)的选择往往取决于项目需求,比如关系型数据库SQL Server和非关系型数据库MongoDB。本篇文章将详细探讨如何将数据从SQL Server迁移到MongoDB,这一过程通常被称为数据导入或数据...
MongoDB性能测试报告详细分析了在大数据量环境下,包括GridFS和组合索引在内的性能表现。通过对5亿数据级别的插入与查询进行测试,本报告旨在探讨不同索引配置、数据量、查询方式等因素对性能的影响。 首先,测试在...
MongoDB是一种分布式数据库系统,广泛应用于大数据存储和处理。在这个“MongoDB集群测试代码”中,我们关注的是MongoDB的两个关键特性:副本集(Replica Set)和分片(Sharding),以及如何通过配置文件和脚本来进行...
Spring Data MongoDB是一个强大的Java库,它为开发人员提供了一种简单的方式来访问和操作MongoDB数据库。这个库是Spring Data框架的一部分,旨在简化数据访问层的实现,尤其在使用NoSQL数据库如MongoDB时。MongoDB...
本文档提供了如何在单机环境下安装和测试MongoDB的流程,尤其适合学生进行学习和实践。 首先,在安装MongoDB之前,需要准备RHEL(Red Hat Enterprise Linux)7.5操作系统。操作系统安装完毕后,接下来的步骤是文件...
CIS MongoDB 6 Benchmark v1.0.0 是一个关于 MongoDB 6 的安全测评文档,由 Center for Internet Security (CIS) 发布。该文档提供了 MongoDB 6 的安全配置和评估指南,旨在帮助用户和管理员保护 MongoDB 6 部署的...
整合了一套crud代码,减少sql查询,封装mysql和mongodb等操作 参数说明https://mp.csdn.net/mp_download/manage/download/UpDetailed
作为文档型数据库的代表,MongoDB使用的是BSON(一种类似JSON的二进制形式)格式存储数据,它与传统的关系型数据库如MySQL使用的SQL语言操作方式有所不同。 MongoDB的集合对应于SQL数据库中的表,文档则对应于表中...
以下是一些关于MongoDB常用SQL操作的关键知识点: 1. **数据模型**:MongoDB基于JSON(JavaScript Object Notation)格式的文档存储数据,这使得它能够存储复杂的数据结构,如嵌套对象和数组。 2. **连接MongoDB**...
该工具将测量每个读/写操作所花费的时间并在完成时提供统计信息(包括平均查询时间和每秒查询数)。 还可以定义要写入和读取的文档数(在“文档”变量中)以及进程应该创建的并发连接数。 目前所有选项都需要在脚本...
flink-sql-connector-mongodb-cdc 2.5-SNAPSHOT
在本实验中,我们将学习如何在 Windows 和 Linux 环境下安装 MongoDB,并了解 MongoDB 的基本操作。 一、MongoDB 安装 ### Windows 环境下安装 MongoDB 1. 下载 MongoDB Windows 版 2. 设置数据文件和日志文件的...
MongoDB是一种分布式文档数据库,广泛应用于现代Web应用、大数据分析、物联网(IoT)和实时应用程序。本资料包涵盖了MongoDB的安装、部署以及相关的操作知识,旨在帮助用户全面理解和掌握MongoDB的基本使用。 首先,...
`mtools` 提供了一系列脚本,帮助用户便捷地创建和配置MongoDB实例,包括启动、停止、复制集配置、数据导入导出等操作。这些脚本简化了繁琐的手动配置,使得开发者可以更专注于应用的开发和测试,而不是数据库的运维...
MongoDB简介 软件测试