0
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**

我认为 find 运算符可能很便宜,但这与我的假设相反。谁能告诉我为什么 find operator 如此耗时?

4

1 回答 1

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 个文档,您可能应该考虑批处理操作或其他数据库模式。也许一些非规范化可以帮助你。

于 2012-07-11T06:32:48.500 回答