find()与findone()的差異


  • 註冊用戶

    2个命令都可以查询集合中的记录数,但测试发现,findone()性能比find()相差约10倍,希望有高手能解答?

    测试:

    for (i=1;i<=100000;i++) { db.c1.find({'_id':i}) }
    for (i=1;i<=100000;i++) { db.c1.findOne({'_id':i}) }

  • 註冊用戶

    因為findone是返回一個符合條件的document,而find是返回cursor,cursor裡面包含很多符合條件的document。


  • 註冊用戶

    經實測差距很大,使用時需特別注意

    for (i=1;i<=100000;i++) { db.c1.insert({'_id':i}) }

    for (i=1;i<=100000;i++) { db.c1.find({'_id':i}) }          耗時 2.48 sec

    for (i=1;i<=100000;i++) { db.c1.find({'_id':i}).limit(1) } 耗時 2.935 sec

    for (i=1;i<=100000;i++) { db.c1.findOne({'_id':i}) }       耗時 58.93 sec


  • 註冊用戶

    不建議使用 findone 除非有什麼特別需求,不然這個耗時很高


  • 註冊用戶

    findOne 一般大家都是用在什麼情況?


  • 註冊用戶

    find 返回的是指標,findone 返回的是文檔

    如果你很確定你要的資料僅有一筆,且Pool 量很小,那麼 findone就是不錯的選擇

    因為他找到後就會關閉了,內存耗損也沒那麼高

    就我個人使用我會使用在已經整理過的資料內,例如討論區有上千用戶

    每週會統計完所有用戶的使用情況,並存到另一個新的表內,這張表了不起就是上千筆乾淨的資料

    這時候,如果我要找某位用戶的使用情況,我就可以直接用 findone 來做

    做個簡單的比較好了,同樣都是找一筆資料,findone  與 find 的差別在於執行動作上

    findone 是 找到第一筆資料,返回數據後,接著關閉指標

    db.collection.find().limit(1) 是先返回指標,獲取所需要得數據,然後再關閉指標

    這期間最大的差異在於,findone 永遠會回傳完整文檔給你,而 find 只會回傳指標給你

    這樣的差別就會影響到速度上的問題了

    這有一篇文章,可以參考看看,請服用 

    本帖下載内容已隐藏,请登入以查看隐藏内容!

     


  • 註冊用戶

    for (i=1;i<=100000;i++) { db.c1.insert({'_id':i}) }
    db.c1.find({'_id':1})             耗時 0.001 sec
    db.c1.find({'_id':1}).limit(1)    耗時 0.001 sec
    db.c1.findOne({'_id':1})          耗時 0.001 sec
    同樣都是找一筆資料,耗時是一樣的


登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待