2012-07-11 46 views
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** 

我覺得找運營商可能這麼便宜,卻是相反我的假設。 任何人都可以告訴我爲什麼找到操作員是如此費時?

+0

你想要測試什麼?非索引查找與防火忘記寫入?單個查詢中包含10k個文檔?這聽起來不像是一個特別豐富的測試,因爲它與你在生產系統中做的任何事情沒有任何關係。 – 2012-07-11 09:02:32

回答

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個文檔,則應該考慮批處理操作或其他數據庫模式。也許一些反規範化可以幫助你。

+0

更不用說記錄的查詢時間僅爲每個查詢* 0.97毫秒*。這相當快,特別是當你認爲那段時間很大一部分可能是網絡時。 – 2012-07-11 06:45:24