为什么pymongo的两种连接mongoDB的方法效率相差这么多,求原理科普

最近项目在使用mongoDB,用起来是挺好用的,但是用户上量之后,明显就感觉有点慢,为什么这么慢,我就开始慢慢的寻找原因。

结合网上的测试脚本以及一些朋友们的测试结果和我自己测试的结果,我发现mongoDB真的没有那么慢,那是我哪里写错了?

我就开始排查项目代码中中哪里和测试脚本中写的不一样,结果就找到了数据库的连接方式,项目中一开始采用的是现在pymongo推荐的MongoClient(ip,port)的方式,但是测试脚本中采用的是Connection(ip,port)的方式,经过不同数量级的测试得出了如下的结果:

方法

数量

时间

Connection

1

0.000314950942993

MongoClient

1

0.000757217407227

Connection

10

0.00154709815979

MongoClient

10

0.00501179695129

Connection

100000

6.14999890327

MongoClient

100000

27.3278138638

Connection

1000000

59.0989689827

MongoClient

1000000

273.486183882

  • 结果分析

  从上表的结果可以看出,基本上MongoClient的连接方式插入数据的时间是Connection连接方式插入数据的4倍左右,当然数据量小的时候可能建立连接还有一些非相关的操作可能占的比重比较大,越到后来就越稳定。

  • 疑问

  1、这就让我产生了疑问,pymongo这两种方式的实现原理有怎样的不同之处,造成他们的写效率相差如此之多?

  2、项目中当然要采用连接效率比较高的方法,但是现在不知道实现的原理,心里就比较没底,不太确定的是Connection的方法虽然比较快,但是会不会需要手动管理连接资源;如果操作太多了的话会不会造成资源的占用

还请各位大神们推荐一些能够解决这些问题的地方,或者是给一下参考资料我自己去研究一下

  • 最终解决问题

  最后经过查阅文献,google/baidu,以及参阅pymongo的官方文档,发现pymongo对于mongoDB的写操作有安全模式和非安全模式两种,非安全模式的意思是在写入过程中只管向mongoDB发送写入请求,并不去查询写入的结果,这样在写入的逻辑上就简单了很多,但需要外界的环境较为可靠才能保证写入的请求完全执行;安全模式就是写入过程中还要查看写入结果,写入成功之后再执行下一条操作,所以比之前的非安全模式要慢了不少。

  pymongo文档有关连接方面的介绍的地址如下:http://api.mongodb.org/python/current/api/pymongo/mongo_client.html?highlight=mongoclient#pymongo.mongo_client.MongoClient

  但是现在还有一个问题就是所谓的非安全模式到底比安全模式差多少,如果不去查看请求的执行结果会有多少请求丢失或不被执行,这个问题好像官方并没有很好的解释和详细的数据,希望大家发现的告知一下,我也好好探索一下。

posted @ 2015-08-13 21:13  gcynewstart  阅读(1809)  评论(1)    收藏  举报