2012-11-02 102 views
3

我有一個OR查詢,我目前正在使用一個半大的更新。基本上我的收藏被分成兩個數據集;MongoDB或條件索引

1個主存儲庫和1個主存儲庫子集。這只是爲了更快地搜索一小部分數據。

但是我發現我創建的東西拉入子集的查詢是超時..當查看解釋它看起來像兩個查詢實際上正在發生。

PRIMARY> var date = new Date(2012,05,01); 
PRIMARY> db.col.find(
    {"$or":[ 
     {"date":{"$gt":date}}, 
     {"keywords":{"$in":["Help","Support"]}} 
    ]}).explain(); 

這將產生:

{ 
"clauses" : [ 
    { 
     "cursor" : "BtreeCursor ldate_-1", 
     "nscanned" : 1493872, 
     "nscannedObjects" : 1493872, 
     "n" : 1493872, 
     "millis" : 1035194, 
     "nYields" : 3396, 
     "nChunkSkips" : 0, 
     "isMultiKey" : false, 
     "indexOnly" : false, 
     "indexBounds" : { 
      "ldate" : [ 
       [ 
        ISODate("292278995-01--2147483647T07:12:56.808Z"), 
        ISODate("2012-06-01T07:00:00Z") 
       ] 
      ] 
     } 
    }, 
    { 
     "cursor" : "BtreeCursor keywords_1 multi", 
     "nscanned" : 88526, 
     "nscannedObjects" : 88526, 
     "n" : 2515, 
     "millis" : 1071902, 
     "nYields" : 56, 
     "nChunkSkips" : 0, 
     "isMultiKey" : false, 
     "indexOnly" : false, 
     "indexBounds" : { 
      "keywords" : [ 
       [ 
        "Help", 
        "Help" 
       ], 
       [ 
        "Support", 
        "Support" 
       ] 
      ] 
     } 
    } 
], 
"nscanned" : 1582398, 
"nscannedObjects" : 1582398, 
"n" : 1496387, 
"millis" : 1071902 
} 

有什麼我可以更好地索引,使這個更快?似乎只是緩慢的方式...

提前感謝!

+0

你的索引是什麼?只是提交日期? – RameshVel

+0

我試着在關鍵字和日期上創建單獨的索引;並試圖將它們創建爲兩者的複合索引。 – Petrogad

+0

嗯你正在那裏獲取1.4m記錄....這是很多,你可以嘗試在mongo光標上延長計時器來處理這麼大的查詢。你在這裏還有什麼設置?17m是很長的時間,我承認 – Sammaye

回答

1

$or query將分別評估每一個條款,合併結果刪除重複..所以,如果你想優化查詢你應該先每個子句分別嘗試explain()

看起來像問題的一部分是,您正在積極寫入該集合時檢索大量文檔,如高nYields(3396)所證明的那樣。在運行查詢時考慮mongostat輸出是值得考慮的其他因素,例如頁面錯誤,鎖定%和讀/寫隊列。

如果你想使這個查詢了大量的文件和非常活躍收集更新速度加快,要考慮兩個最好的實踐方法是:

1)預聚合

本質上講,這是插入/更新文檔時更新彙總統計信息,以便您可以進行快速的實時查詢。 MongoDB手冊更詳細地描述了這個用例:Pre-Aggregated Reports

2)增量地圖/減少

一種incremental Map/Reduce方法可被用於計算在連續的批次累計統計資料(例如,從每小時或每天計劃作業)。通過這種方法,您可以使用reduce輸出選項執行Map/Reduce以將結果保存到新集合,幷包括query篩選器,該篩選器僅選擇自上次運行Map/Reduce作業以來創建/更新的文檔。

0

我認爲你應該在日期和關鍵字上創建一個複合索引。請參考以下職位更多的細節根據您的使用情況

how to structure a compound index in mongodb

+0

我做到了;但它似乎沒有更快地查詢任何東西。 – Petrogad

+0

@Frederico看到我的更新 –

+0

剛剛檢查;然而,似乎OR條件仍然觸及兩個指標。想象一下,這會讓它放慢速度,因爲它必須兩次查看完全相同的索引,只使用一半的信息。 – Petrogad