【发布时间】: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