0

我正在對mongodb與mysql進行比較,並將mysql數據導入到mongodb集合(> 500000記錄)中。 集合看起來是這樣的:MongoDB與MySQL性能 - 簡單查詢

{ 
    "_id" : ObjectId(""), 
    "idSequence" : , 
    "TestNumber" : , 
    "TestName" : "", 
    "S1" : , 
    "S2" : , 
    "Slottxt" : "", 
    "DUT" : , 
    "DUTtxt" : "", 
    "DUTver" : "", 
    "Voltage" : , 
    "Temperature" : , 
    "Rate" : , 
    "ParamX" : "", 
    "ParamY" : "", 
    "Result" : , 
    "TimeStart" : new Date(""), 
    "TimeStop" : new Date(""), 
    "Operator" : "", 
    "ErrorNumber" : , 
    "ErrorText" : "", 
    "Comments" : "", 
    "Pos" : , 
    "SVNURL" : "", 
    "SVNRev" : , 
    "Valid" : 
} 

當比較查詢(兩者返回15條):

mysql -> SELECT TestNumber FROM db WHERE Valid=0 AND DUT=68 GROUP BY TestNumber 

mongodb -> db.results.distinct("TestNumber", {Valid:0, DUT:68}).sort() 

結果是等效的,但需要( iro)從mongodb開始17secs,而mysql從0.03秒開始。

我明白,很難做出兩個數據庫架構之間的比較,我進一步讚賞mongodb管理員的技能之一是相應地組織數據結構(因此,這不是一個公正的測試,只是導入MySQL結構)參考號:MySQL vs MongoDB 1000 reads

但是,返回差異的時間太長,無法成爲調整問題。 我(默認)MongoDB的日誌文件上寫着:

週三04年3月5日:56:36.415 [conn4089]命令NTV_Results $ cmd命令:{不同: 「結果」,關鍵: 「TestNumber」,查詢:{有效:0.0,DUT:68.0}} ntoreturn:1個keyUpdates:0 numYields:6個鎖(百萬分之一)R:21764672個reslen:250 16525ms

我也曾嘗試查詢:

db.results.group({ 
       key: { "TestNumber": 1 }, 
       cond: {"Valid": 0, "DUT": 68 }, 
       reduce: function (curr, result) { }, 
       initial: { } 
      }) 

隨着類似(17秒)的結果,我做錯了什麼線索? 這兩種服務都運行在具有Windows 7和16Gb RAM的八核心i7 3770臺式機上。

+0

你有testnumber字段的索引嗎? –

+1

這些函數都不是您嘗試執行的操作類型的好例子,因爲它們是被認爲被[聚合管道]取代的舊實現(http://docs.mongodb.org/manual/core/聚合管道/)閱讀進一步的信息 –

+0

固定:需要閱讀索引的wrt mongodb。特別是如果導入現有的MySQL數據庫,因爲它們可能不是默認創建的。 –

回答

3

可能有很多原因導致性能下降,其中大部分內容太詳細了。但我可以爲你提供一個「初學者包」。

在您的ValidDUT字段上創建Indexes字段將改善這些查詢和其他查詢的結果。使用ensureIndex命令

db.collection.ensureIndex({ "Valid": 1, "DUT": 1}) 

還建議對這些類型的操作使用aggregate考慮這種化合物的形式這種情況下:

db.collection.aggregate([ 
    {$match: { "Valid": 0, "DUT": 68 }}, 
    {$group: { _id: "$TestNumber" }} 
]) 

應該是你指的是SQL的等價物。

有一個SQL to Aggregation Mapping Chart,可能會給你一些思想的援助。爲了編寫有效的查詢,也值得熟悉aggregation operators的區別。

我花了很多年爲高級任務編寫非常複雜的SQL。我發現聚合框架爲各種問題解決案例提供了新鮮空氣。

值得你學習的時間。

也值得注意。您的「默認」MongoDB日誌文件正在報告這些操作,因爲它們被認爲是「慢速查詢」,然後通過「默認」引起您的注意。您還可以根據需要調整database profiler以滿足您的需求,從而查看更多或更少的信息。

+0

很好的解釋! –

+0

感謝有關聚合的提示。實際的修復程序是創建索引。當我導入mysql數據庫時,沒有創建索引。我絕對懷疑我不是第一個(或最後一個)不知道這一點。所以我感謝你的幫助和迅速的迴應。 –

+0

我不太確定聚集{match,group} cmd(特別是對於我的任務),因爲我使用的db.collection.distinct()現在是最快的 - 這是一種聚合 - 我閱讀:)但你肯定給了我一個加入的媒介,所以再次感謝。 –