MongoDB比SQL Server慢
我在SQL Server表和MongoDB集合中保存了大约3000万条记录的相同数据。下面显示了一个示例记录,我也设置了相同的索引。下面是返回相同数据的查询,一个在SQL中,另一个在mongo中。SQL查询的计算和返回需要2秒,而mongo则需要50秒。你知道为什么mongo比SQL慢这么多吗 SQL 蒙戈 示例文档中,两个文档中大约有3000万个完全相同的数据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
{
"_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正在使用FETCHMongoDB版本很慢,因为
$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
}