【发布时间】:2014-04-06 23:34:53
【问题描述】:
我正在对 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 需要 (iro) 17 秒,而从 mysql 需要 0.03 秒。
我理解很难在两种数据库架构之间进行比较,我进一步理解 mongodb 管理员的一项技能是相应地组织数据结构(因此仅导入 mysql 结构不是一个公平的测试) 参考:MySQL vs MongoDB 1000 reads
但是返回差异的时间太长了,不是调优问题。 我的(默认)mongodb 日志文件内容如下:
Wed Mar 05 04:56:36.415 [conn4089] command NTV_Results.$cmd command: { distinct: "results", key: "TestNumber", query: { Valid: 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 台式电脑上运行。
【问题讨论】:
-
你在 testnumber 字段上有索引吗?
-
这些函数都不是您尝试执行的操作类型的好例子,因为它们是旧的实现,被认为被 aggregation pipeline 取代,阅读更多信息跨度>
-
修复:需要阅读索引的 wrt mongodb。特别是如果导入现有的 mysql 数据库,因为它们可能不会默认创建。
标签: mysql mongodb performance mongodb-query aggregation-framework