MongoDB与MySQL效率对比

本文对比了MongoDB与MySQL在批量操作时的性能,包括插入、删除和更新。结果显示,MongoDB的bulkWrite()方法在批量操作时表现出更高的效率。MongoDB批量插入、删除和更新比非批量操作速度显著提升,而MySQL批处理方式比非批处理速度快,但提升不如MongoDB明显。
摘要由CSDN通过智能技术生成

本文主要通过批量与非批量对比操作的方式介绍MongoDB的bulkWrite()方法的使用。顺带与关系型数据库MySQL进行对比,比较这两种不同类型数据库的效率。如果只是想学习bulkWrite()的使用的看第一部分就行。

测试环境:win7旗舰版、16G内存、i3处理器、MongoDB3.0.2、mysql5.0

一、MongoDB批量操作

MongoDB对数据的操作分为Read Operations和Write Operations,Read Operations包含查询操作,Write Operations包含删除、插入、替换、更新几种操作。MongoDB提供客户端用bulk方式执行Write Operations,也就是批量写操作。在java driver中,对应MongoCollection的bulkWrite()方法,先来看下这个方法签名:

BulkWriteResult  com.mongodb.client.MongoCollection.bulkWrite(List<? extends WriteModel<? extends Document>> requests)

这个方法要求传入一个List集合,集合中的元素类型为WriteModel,它表示一个可用于批量写操作的基类模型,它有以下几个子类DeleteManyModel、DeleteOneModel、 InsertOneModel、ReplaceOneModel、 UpdateManyModel、UpdateOneModel,从名字可以看出来它对应了删除、插入、替换、更新几种操作。该方法返回一个BulkWriteResult对象,代表一个成功的批量写操作结果,封装了操作结果的状态信息,如插入、更新、删除记录数等。

1、插入操作

(1)、批量插入

代码如下,该方法接收一个包含要进行插入的Document对象的集合参数,遍历集合,使用Document构造InsertOneModel对象,每个InsertOneModel实例代表一个插入单个Document的操作,然后将该实例添加List集合中,调用bulkWrite()方法,传入存储所有插入操作的List集合完成批量插入。

public void bulkWriteInsert(List<Document> documents){
 List<WriteModel<Document>> requests = new ArrayList<WriteModel<Document>>();
 for (Document document : documents) {
  //构造插入单个文档的操作模型
  InsertOneModel<Document>  iom = new InsertOneModel<Document>(document);
  requests.add(iom);
 }
 BulkWriteResult  bulkWriteResult = collection.bulkWrite(requests);
 System.out.println(bulkWriteResult.toString());
}

测试:下面通过一个main函数测试下。首先构造10万个Product实体对象,使用一个工具类将其转换成json字符串,然后解析成Document对象,保存到一个list集合中,然后调用上面编写的方法测试10万个对象插入时间。

TestMongoDB instance = TestMongoDB.getInstance();
ArrayList<Document> documents = new ArrayList<Document>();
for (int i = 0; i < 100000; i++) {
 Product product = new Product(i,"书籍","追风筝的人",22.5);
 //将java对象转换成json字符串
 String jsonProduct = JsonParseUtil.getJsonString4JavaPOJO(product);
 //将json字符串解析成Document对象
 Document docProduct = Document.parse(jsonProduct);
 documents.add(docProduct);
}

System.out.println("开始插入数据。。。");
long startInsert = System.currentTimeMillis();
instance.bulkWriteInsert(documents);
System.out.println("插入数据完成,共耗时:"+(System.currentTimeMillis() - startInsert)+"毫秒");

结果:1560毫秒,多次测试基本在1.5秒左右

图片

(2)、逐条插入

下面再通过非批量插入10万个数据对比下,方法如下:

 public void insertOneByOne(List<Document> documents) throws ParseException{
  for (Document document : documents){
   collection.insertOne(document);
  }
 }

测试:10万条数据

System.out.println("开始插入数据。。。");
long startInsert = System.currentTimeMillis();
instance.insertOneByOne(documents);
System.out.println("插入数据完成,共耗时:"+(System.currentTimeMillis() - startInsert)+"毫秒");

结果:12068毫秒,差距非常大。由此可见,MongoDB批量插入比逐条数据插入效率提高了非常多。

图片

补充:

MongoCollection的insertMany()方法和bulkWrite()方法是等价的,测试时间差不多,不再贴图。

 public void insertMany(List<Document> documents) throws 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值