TRx*_*dio 0 mysql performance mongodb 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" :
}
Run Code Online (Sandbox Code Playgroud)
比较查询时(都返回 15 条记录):
mysql -> SELECT TestNumber FROM db WHERE Valid=0 AND DUT=68 GROUP BY TestNumber
Run Code Online (Sandbox Code Playgroud)
和
mongodb -> db.results.distinct("TestNumber", {Valid:0, DUT:68}).sort()
Run Code Online (Sandbox Code Playgroud)
结果是等价的,但从 mongodb 需要 (iro) 17 秒,而从 mysql 需要 0.03 秒。
我意识到很难在两种 db 架构之间进行比较,我进一步意识到 mongodb admin 的一项技能是相应地组织数据结构(因此,仅导入 mysql 结构并不是一个公平的测试)参考:MySQL 与 MongoDB 1000 次读取
但是返回时间差异太大,不能成为调整问题。我的(默认)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 锁 (micros) r:21764672 reslen:250 16525ms
我也试过查询:
db.results.group( {
key: { "TestNumber": 1 },
cond: {"Valid": 0, "DUT": 68 },
reduce: function ( curr, result ) { },
initial: { }
} )
Run Code Online (Sandbox Code Playgroud)
有类似(17 秒)的结果,任何关于我做错了什么的线索?这两项服务都在具有 Windows 7 和 16Gb RAM 的相同八核 i7 3770 台式 PC 上运行。
性能缓慢的原因可能有很多,其中很多细节在这里无法详细介绍。但我可以为您提供一个“入门包”。
在您的和字段上创建索引将改善这些和其他查询的结果。使用ensureIndex命令考虑这种复合形式ValidDUT
db.collection.ensureIndex({ "Valid": 1, "DUT": 1})
Run Code Online (Sandbox Code Playgroud)
此外,建议对这些类型的操作使用聚合:
db.collection.aggregate([
{$match: { "Valid": 0, "DUT": 68 }},
{$group: { _id: "$TestNumber" }}
])
Run Code Online (Sandbox Code Playgroud)
应该等同于您所指的 SQL。
有一个SQL to Aggregation Mapping Chart可以为您的思考提供一些帮助。为了编写有效的查询,还值得熟悉差异聚合运算符。
我花了很多年时间为高级任务编写非常复杂的 SQL。我发现聚合框架为各种解决问题的案例带来了新鲜空气。
值得你花时间学习。
也值得注意。您的“默认”MongoDB 日志文件正在报告这些操作,因为它们被认为是“慢查询”,然后“默认”会引起您的注意。您还可以通过调整数据库分析器来满足您的需要,根据需要查看更多或更少的信息。
| 归档时间: |
|
| 查看次数: |
3238 次 |
| 最近记录: |