2013-06-11 161 views
0

我是MongoDB的新手。我寫了一個JS查詢,我在mongo shell中運行。極慢的mongoDB查詢

基本上,我有兩張桌子。兩者都有近16萬條記錄。

我在遍歷第一個表和每個記錄,轉到第二個表來查找是否存在相應的記錄。

pbp = db.poss_pbp.find().batchSize(1000) 


while(pbp.hasNext()){ 

    pbp_temp = pbp.next(); 
    id = (pbp_temp["poss_idx"]); 

    opt_temp = db.poss_opt.find({"poss_idx": id}).count() 

    if(opt_temp == 0) 
    { 
    //Do something 
    } 
} 

查詢運行速度非常慢(每1000條記錄約4-5分鐘)。我能做些什麼來使其工作更快?密鑰「poss_idx」在數據庫中有一個索引。

+2

您可能正在造成(等同於)掃描。如果你只關心存在,你可能想要檢查http://stackoverflow.com/questions/8389811/how-to-query-mongodb-to-test-if-an-item-exists。他們似乎認爲'計數'是一個相當緩慢的操作。 – Mitch

+2

如果它只有「160,000條記錄」,那麼您可能需要立即撤回所有的poss_idx'標識符(只需獲取這些標識符),然後在內存中進行本地比較。 – WiredPrairie

回答

1

我認爲索引有問題。我有兩張類似的表格:200,000條記錄和約500,000條記錄。使用索引執行類似的請求大約需要40秒,而沒有索引的執行時間很長。

運行查詢:

db.poss_opt.find({poss_idx: "some_id"}).explain() 

如果上面的查詢無法使用索引,你會看到:

{ 
    "cursor": "BasicCursor", 
    "nscannedObjects": 532543, 
    "nscanned": 532543, 
    "millis": 712, 
    "indexBounds": {}, 
} 

否則:

{ 
    "cursor": "BtreeCursor poss_idx_1", 
    "nscannedObjects": 0, 
    "nscanned": 0, 
    "millis": 0, 
    "indexBounds": {"poss_idx": [["some_id", "some_id"]]}, 
} 

要查看索引信息收集,使用db.poss_opt.stats()db.poss_opt.getIndexes()

如果問題是與索引,嘗試刪除並創建新的一個:

db.poss_opt.dropIndex({poss_idx: 1}) 
db.poss_opt.ensureIndex({poss_idx: 1}) 

如果您有任何疑問,請隨時提問。

+0

問題出在索引上。但是刪除並重新創建它並不能解決問題。 – mihsathe

+0

@mihsathe,你能否提供mongodb版本,樣本文件和stats()結果爲poss_pbp&poss_opt? – Jarandinor