1

巨大な mongodb データベースを作成しました。その統計は次のとおりです。

> db.stats() <br/>
{
        "db" : "test-sample-db",
        "collections" : 3,
        "objects" : 30700242,
        "avgObjSize" : 607.1807849592847,
        "dataSize" : 18640597036,
        "storageSize" : 19531558816,
        "numExtents" : 31,
        "indexes" : 2,
        "indexSize" : 2692111520,
        "fileSize" : 25691160576,
        "nsSizeMB" : 16,
        "dataFileVersion" : {
                "major" : 4,
                "minor" : 5
        },
        "ok" : 1
}

このデータベースを照会するために、Windows 7 (64 ビット) (8 GB RAM) python 2.7 で pymongo を使用しています。インデックスは「キー」と呼ばれるフィールドに作成されることに注意してください。クエリは単純です。指定されたキーを持つすべてのドキュメントが必要です。$in を次のように使用しました。

result = testdb.find({"key": {"$in":lt}})
for doc in result:
    pass

上記の「lt」のサイズは約 1000 です。したがって、このクエリは amx で 1000 ドキュメントを返します。私が気付いたのは、このクエリが非常に遅いということです。上記のコードに示すように、このクエリを実行してカーソルを反復処理するには、約 5 ~ 6 秒かかります。これを最適化して、この操作をより高速にする方法はありますか?

サンプル文書:

{"key" : "abcd12xx", "data" : {"w1" : 1, "w3": 1, "w4" : 3}}

query.explain() の出力 (ここではスペースを節約するために 10 個のキーだけではありません。通常は 1000 個のキーがあるため、これは大きくなります):

{    u'nYields': 0, 
     u'nscannedAllPlans': 19, 
     u'allPlans': [{u'cursor': u'BtreeCursor feature_1 multi', 
                    u'indexBounds': {u'feature': [[u'1000', u'1000'], [u'1001', u'1001'],
                              [u'1002', u'1002'], [u'1003', u'1003'], [u'1004', u'1004'],
                              [u'1005', u'1005'], [u'1006', u'1006'], [u'1007', u'1007'],
                              [u'1008', u'1008'], [u'1009', u'1009']]
                    }, 
                    u'nscannedObjects': 10, 
                    u'nscanned': 19, 
                    u'n': 10}], 
     u'millis': 0, 
     u'nChunkSkips': 0, 
     u'server': u'server:27017', 
     u'n': 10, 
     u'cursor': u'BtreeCursor feature_1 multi'
}
4

0 に答える 0