我正在对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台式机上。
答案 0 :(得分:3)
性能缓慢可能有很多原因,其中很多原因都是太多细节。但我可以为你提供一个“初学者包”。
在Valid
和DUT
字段上创建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以满足您的需求。