私は、SQL ServerテーブルとMongoDBコレクションに保存されている約3000万レコードの同じデータを持っています。以下にサンプルレコードを示します。同じインデックスも設定しています。以下は、同じデータを返すためのクエリです。SQLで1つ、mongoで1つです。 SQLクエリは2秒で計算して返します。一方、mongoは50になります。なぜmongoがSQLよりもずっと遅いのですか?MongoDBはSQL Serverより遅い
SQL
SELECT
COUNT(DISTINCT IP) AS Count,
DATEPART(dy, datetime)
FROM
collection
GROUP BY
DATEPART(dy, datetime)
MONGO
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両方でまったく同じデータがあります両方の説明を追加クエリ
私はDBAか何かじゃないので、私はそれに権限を持っていないが、それは私がその実行計画についてあまり心配していないだと十分に速く動作しますMONGO
{
"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の、面倒私に事はモンゴは$group
can't use an index(クエリプランで"COLLSCAN"
によって証明されるように)ので、すべての3000万ドキュメントがメモリに読み込まれ、パイプラインを介して実行されなければならないので、
mysqlとmongoの両方の実行計画を投稿できますか? – mszymborski
AFAIK、MongoDBはNoSQLであり、これらのデータベースエンジンはBigDataおよびNon-Relationalデータベース用に設計されています。それが結果かもしれない。私も答えが分かっていることに興味があります:) – FLICKER
私はmongoの実行計画を含めるように質問を更新しました.Mongoがこれを長く取ってSQLに時間がかからなかった場合は明らかに何か設定されている必要があります間違っていると言われているように、SQLより大きい大きなデータを扱うように設計されているからです。 –