MongoDB 与 MySQL 性能 - 简单查询

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 上运行。

Nei*_*unn 5

性能缓慢的原因可能有很多,其中很多细节在这里无法详细介绍。但我可以为您提供一个“入门包”。

在您的和字段上创建索引将改善这些和其他查询的结果。使用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 日志文件正在报告这些操作,因为它们被认为是“慢查询”,然后“默认”会引起您的注意。您还可以通过调整数据库分析器来满足您的需要,根据需要查看更多或更少的信息。