MongoDB与MySQL性能 - 简单查询

时间:2014-03-05 04:48:03

标签: mysql mongodb performance mongodb-query aggregation-framework

我正在对mongodb进行mysql的比较,并将mysql数据导入mongodb集合(> 500000条记录)。 该集合看起来像这样:

{
    "_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()

结果是等价的,但mongodb需要17个(iro),而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的同一台octo-core i7 3770台式机上。

1 个答案:

答案 0 :(得分: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以满足您的需求。