【问题标题】:MongoDB is slower than SQL ServerMongoDB 比 SQL Server 慢
【发布时间】:2016-11-29 10:30:31
【问题描述】:

我在 SQL Server 表和 MongoDB 集合中保存了大约 3000 万条记录的相同数据。下面显示了一个示例记录,我也设置了相同的索引。下面是返回相同数据的查询,一个在 SQL 中,另一个在 mongo 中。 SQL 查询需要 2 秒来计算和返回,而 mongo 需要 50 秒。任何想法为什么 mongo 比 SQL 慢这么多??

SQL

SELECT 
    COUNT(DISTINCT IP) AS Count,
    DATEPART(dy, datetime)
FROM 
    collection
GROUP BY 
    DATEPART(dy, datetime) 

蒙哥

db.collection.aggregate([{$group:{ "_id": { $dayOfYear:"$datetime" }, IP: { $addToSet: "$IP"} }},{$unwind:"$IP"},{$group:{ _id: "$_id", count: { $sum:1} }}])

示例文档,两者中大约有 3000 万条完全相同的数据

{
  "_id" : ObjectId("57968ebc7391bb1f7c2f4801"),
  "IP" : "127.0.0.1",
  "userAgent" : "Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+LCTE;+rv:11.0)+like+Gecko",
  "Country" : null,
  "datetime" : ISODate("2016-07-25T16:50:18-05:00"),
  "proxy" : null,
  "url" : "/records/archives/archivesdb/deathcertificates/",
  "HTTPStatus" : "302",
  "HTTPResponseTime" : "218"
}

EDIT:添加了两个查询的解释

蒙哥

{
    "waitedMS" : NumberLong(0),
    "stages" : [
        {
            "$cursor" : {
                "query" : {

                },
                "fields" : {
                    "IP" : 1,
                    "datetime" : 1,
                    "_id" : 0
                },
                "queryPlanner" : {
                    "plannerVersion" : 1,
                    "namespace" : "IISLogs.pubprdweb01",
                    "indexFilterSet" : false,
                    "parsedQuery" : {
                        "$and" : [ ]
                    },
                    "winningPlan" : {
                        "stage" : "COLLSCAN",
                        "filter" : {
                            "$and" : [ ]
                        },
                        "direction" : "forward"
                    },
                    "rejectedPlans" : [ ]
                }
            }
        },
        {
            "$group" : {
                "_id" : {
                    "$dayOfYear" : [
                        "$datetime"
                    ]
                },
                "IP" : {
                    "$addToSet" : "$IP"
                }
            }
        },
        {
            "$unwind" : {
                "path" : "$IP"
            }
        },
        {
            "$group" : {
                "_id" : "$_id",
                "count" : {
                    "$sum" : {
                        "$const" : 1
                    }
                }
            }
        }
    ],
    "ok" : 1
}

SQL Server 我没有权限,因为我不是 DBA 或其他任何人,但它运行得足够快,我不太关心它的执行计划,对我来说麻烦的是 mongo 是使用 FETCH

【问题讨论】:

  • 你能把mysql和mongo的执行计划贴出来吗?
  • AFAIK,MongoDB 是 NoSQL,那些数据库引擎是为大数据和非关系数据库设计的。结果可能就是这样。我也很想知道答案是什么:)
  • 我已经更新了这个问题以包括 mongo 的执行计划,我同意如果 Mongo 花了这么长时间来做一些 SQL 没有时间做的事情,显然肯定是配置错误,因为就像你说的那样旨在通过 SQL 更多地处理大数据
  • MongoDB 不太擅长聚合,所以这并不奇怪。
  • 请提供您的收藏的 MongoDB 版本和索引列表。

标签: sql sql-server mongodb aggregation-framework


【解决方案1】:

MongoDB 版本很慢,因为$groupcan't use an index(由查询计划中的"COLLSCAN" 证明),因此所有 3000 万个文档都必须读入内存并通过管道运行。

这种类型的实时查询(计算所有文档的摘要数据)根本不适合 MongoDB。最好定期运行 aggregate$out 阶段(或使用 map-reduce)从主集合生成摘要数据,然后查询生成的摘要集合。

【讨论】:

  • 那是mongo的错吗?既然它不能在组上使用索引?但是 sql 仍然只需要几秒钟,还必须扫描整个表,那么尝试使用 mongo 有什么意义呢?
  • 不一定非得是map reduce。添加一个简单的$out 阶段可能会更好地达到相同的目的。
  • @MarkusWMahlberg 对,这就是我所说的“(或聚合)”。我会澄清的。
猜你喜欢
  • 1970-01-01
  • 2012-06-11
  • 2015-05-20
  • 2014-12-12
  • 2011-05-13
  • 2015-01-27
  • 2019-04-23
  • 1970-01-01
  • 2021-04-12
相关资源
最近更新 更多