def test_find_update():
db = Connection()
db.drop_collection("test")
db.test.insert({"x":1,"y":2})
start = time.time()
for i in range(1,10000):
y = db.test.find_one()
print db.test.find_one()
print time.time()-start
db.drop_collection("test")
start = time.time()
for i in range(1,10000):
db.test.insert({"x":1,"y":2})
print db.test.find_one()
print time.time()-start
db.drop_collection("test")
db.test.insert({"x":1,"y":2})
start = time.time()
for i in range(1,10000):
db.test.update({},{"$inc":{"x":1,"y":2}})
print db.test.find_one()
print time.time()-start
结果:
{u'y': 2, u'x': 1, u'_id': ObjectId('4ffd159ae3f0f8103a000000')}
**9.78821802139**
{u'y': 2, u'x': 1, u'_id': ObjectId('4ffd15a4e3f0f8103a000001')}
**0.82381606102**
{u'y': 200000, u'x': 100000, u'_id': ObjectId('4ffd15a5e3f0f8103a002710')}
**0.635884046555**
我认为查找运算符可能如此便宜,但它与我的假设相反。 任何人都可以告诉我为什么查找运算符是如此耗时?
答案 0 :(得分:1)
当您从PyMongo发出插入或更新调用时,它不会等待来自服务器的回复,而是立即返回。如果您更改代码,以便更新和插入调用如下所示:
db.test.insert({"x":1,"y":2}, safe=True)
db.test.update({},{"$inc":{"x":1,"y":2}}, safe=True)
这将花费更长的时间:
{u'y': 2, u'x': 1, u'_id': ObjectId('4ffd1d8d29277b1606000000')}
2.05725502968
{u'y': 2, u'x': 1, u'_id': ObjectId('4ffd1d8f29277b1606000001')}
1.98976802826
{u'y': 20000, u'x': 10000, u'_id': ObjectId('4ffd1d9129277b1606002710')}
1.96105003357
有关参考,请参阅pymongo.collection上的文档。
编辑:我不确定你要在这里测试什么,因为在现实生活中这种情况可能不会发生。如果您发现自己按顺序查找()10000个文档,则应该考虑批处理操作或其他数据库模式。也许一些非规范化可以帮助你。