MongoDB比SQL Server慢

MongoDB比SQL Server慢,sql,sql-server,mongodb,aggregation-framework,Sql,Sql Server,Mongodb,Aggregation Framework,我在SQL Server表和MongoDB集合中保存了大约3000万条记录的相同数据。下面显示了一个示例记录,我也设置了相同的索引。下面是返回相同数据的查询,一个在SQL中,另一个在mongo中。SQL查询的计算和返回需要2秒,而mongo则需要50秒。你知道为什么mongo比SQL慢这么多吗 SQL 蒙戈 示例文档中,两个文档中大约有3000万个完全相同的数据 { "_id" : ObjectId("57968ebc7391bb1f7c2f4801"), "IP" : "127.0.0

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

SQL

蒙戈

示例文档中,两个文档中大约有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"
}
编辑:添加了两个查询的解释

蒙戈


SQL Server我没有对它的权限,因为我不是DBA或任何东西,但它的运行速度足够快,我不太关心它的执行计划,对我来说,麻烦的是mongo正在使用FETCH

MongoDB版本很慢,因为
$group
(查询计划中的
“COLLSCAN”
就证明了这一点),因此,所有3000万份文档都必须读入内存并通过管道运行


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

MongoDB版本比较慢,因为
$group
(查询计划中的
“COLLSCAN”
就证明了这一点),因此,所有3000万份文档都必须读入内存并通过管道运行


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

您能发布mysql和mongo的执行计划吗?AFAIK,MongoDB是NoSQL,这些数据库引擎是为大数据和非关系数据库设计的。这可能就是结果。我也很想知道答案是什么:)我已经更新了问题,包括mongo的执行计划,我同意,如果Mongo花了这么长时间去做一些SQL没有花时间的事情,那么肯定是配置错误了,因为正如您所说的,它的设计目的是通过SQLMongoDB来处理大数据,而SQLMongoDB不太擅长聚合,所以这并不奇怪。请提供MongoDB版本和集合的索引列表。您可以发布mysql和mongo的执行计划吗?好的,MongoDB是NoSQL,这些数据库引擎是为BigData和非关系数据库设计的。这可能就是结果。我也很想知道答案是什么:)我已经更新了问题,包括mongo的执行计划,我同意,如果Mongo花了这么长时间去做一些SQL没有花时间的事情,那么肯定是配置错误了,因为正如您所说的,它的设计目的是通过SQLMongoDB来处理大数据,而SQLMongoDB不太擅长聚合,所以这并不奇怪。请提供MongoDB版本和集合的索引列表。那么这就是mongo的错?因为它不能在组上使用索引?但是sql仍然只花了几秒钟,而且还必须扫描整个表,所以尝试使用mongo有什么意义呢?它不一定是map reduce。添加一个简单的
$out
阶段可能更好地达到同样的目的。@MarkusWMahlberg对,这就是我所说的“(或聚合)”。我会澄清的,那是mongo的错?因为它不能在组上使用索引?但是sql仍然只花了几秒钟,而且还必须扫描整个表,所以尝试使用mongo有什么意义呢?它不一定是map reduce。添加一个简单的
$out
阶段可能更好地达到同样的目的。@MarkusWMahlberg对,这就是我所说的“(或聚合)”。我会澄清的。
db.collection.aggregate([{$group:{ "_id": { $dayOfYear:"$datetime" }, IP: { $addToSet: "$IP"} }},{$unwind:"$IP"},{$group:{ _id: "$_id", count: { $sum:1} }}])
{
  "_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"
}
{
    "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
}