2016-07-25 16 views
0

私は、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の、面倒私に事はモンゴは$groupcan't use an index(クエリプランで"COLLSCAN"によって証明されるように)ので、すべての3000万ドキュメントがメモリに読み込まれ、パイプラインを介して実行されなければならないので、

+1

mysqlとmongoの両方の実行計画を投稿できますか? – mszymborski

+0

AFAIK、MongoDBはNoSQLであり、これらのデータベースエンジンはBigDataおよびNon-Relationalデータベース用に設計されています。それが結果かもしれない。私も答えが分かっていることに興味があります:) – FLICKER

+0

私はmongoの実行計画を含めるように質問を更新しました.Mongoがこれを長く取ってSQLに時間がかからなかった場合は明らかに何か設定されている必要があります間違っていると言われているように、SQLより大きい大きなデータを扱うように設計されているからです。 –

答えて

2

ザ・MongoDBのバージョンが遅いFETCHを使用していることです。

このタイプのリアルタイムクエリ(すべてのドキュメントの集計データ)は、MongoDBにはあまり適していません。 aggregate$outステージ(またはmap-reduceを使用)で定期的に実行して、メインコレクションからサマリーデータを生成し、代わりにその結果のサマリーコレクションを照会する方が良いでしょう。

+0

これはmongoの障害ですか?グループのインデックスを使用できないためですか?しかし、まだSQLだけで数秒かかって、テーブル全体をスキャンしなければならなかったので、mongoを使用しようとしているのは何ですか? –

+0

@BrandonTomblinson私の更新を見てください。 – JohnnyHK

+0

必ずしも地図を縮小する必要はありません。シンプルな '$ out'ステージを追加することで、同じ目的をよりよく果たすことができます。 –

関連する問題