插入/查找/更新操作员性能?

时间:2012-07-11 06:07:24

标签: python mongodb performance nosql

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

我认为查找运算符可能如此便宜,但它与我的假设相反。 任何人都可以告诉我为什么查找运算符是如此耗时?

1 个答案:

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