2

だから、これは私のデータベースがどのように見えるかです:

> show dbs
admin   0.203125GB
local   0.078125GB
profiler    63.9228515625GB
> use profiler
switched to db profiler
> show collections
documents
mentions

メンション内のドキュメントは次のようになります。

> db.mentions.findOne()
{
    "_id" : ObjectId("51ec29ef1b63042f6a9c6fd2"),
    "corpusID" : "GIGAWORD",
    "docID" : "WPB_ENG_20100226.0044",
    "url" : "http://en.wikipedia.org/wiki/Taboo",
    "mention" : "taboos",
    "offset" : 4526
}

ドキュメント内のドキュメントは次のようになります。

> db.documents.findOne()
{
    "_id" : ObjectId("51ec2d981b63042f6ae4ca0b"),
    "sentence_offsets" : [
        ..................
    ],
    "docID" : "WPB_ENG_20101020.0002",
    "text" : ".........",
    "verb_offsets" : [
    .............
    ],
    "mentions" : [
        {
            "url" : "http://en.wikipedia.org/wiki/Washington,_D.C.",
            "mention" : "Washington",
            "ner" : "ORG",
            "offset" : 122
        },
        ...................
    ],
    "corpusID" : "GIGAWORD",
    "chunk_offsets" : [
        .................
    ]
}

メンションには 1 億のドキュメントがあり、ドキュメントには 130 万のドキュメントがあります。に出現する各言及mentionsは、 somedocumentmentions配列にも 1 回出現する必要があります。ドキュメントにメンション情報を保存する理由は、コンテキストを取得するためにメンションに入らないようにするためです。しかし、言及のみを照会するときは、独立したコレクションmentions.

しかし、mentions.url/mentions.mentiondocuments.mentions.url/documents.mentions.mentionの両方で index を実験し、両方のコレクションで同じ url/mention をクエリしたところ、ドキュメント コレクションからの応答は、メンション コレクションからの応答よりも 2 倍高速であることがわかりました。

インデックスが内部でどのように機能するかはわかりませんが、両方のコレクションに同じ数の言及があるため、両方のインデックスが同じサイズであると想定しています。したがって、それらは同じ応答時間を持つ必要がありますか?

私は何かをしようとしていた

> db.mentions.find({url: "http://en.wikipedia.org/wiki/Washington,_D.C."}).explain()

したがって、ネットワーク オーバーヘッドに違いはないはずです。

ここに出力があります

> db.mentions.find({mention: "Illinois"}).explain()

{
"cursor" : "BtreeCursor mention_1",
"isMultiKey" : false,
"n" : 4342,
"nscannedObjects" : 4342,
"nscanned" : 4342,
"nscannedObjectsAllPlans" : 4342,
"nscannedAllPlans" : 4342,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 14,
"nChunkSkips" : 0,
"millis" : 18627,
"indexBounds" : {
    "mention" : [
        [
            "Illinois",
            "Illinois"
        ]
    ]
},
"server" : "----:----"
}

そしてそれの

> db.documents.find({"mentions.mention": "Illinois"}).explain()

{
"cursor" : "BtreeCursor mentions.mention_1",
"isMultiKey" : true,
"n" : 3102,
"nscannedObjects" : 3102,
"nscanned" : 3102,
"nscannedObjectsAllPlans" : 3102,
"nscannedAllPlans" : 3102,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 8,
"nChunkSkips" : 0,
"millis" : 7862,
"indexBounds" : {
    "mentions.mention" : [
        [
            "Illinois",
            "Illinois"
        ]
    ]
},
"server" : "----:----"
}

そして統計 (ええ、私はコレクションを復元しましたが、documents.url のインデックスはまだ作成していません):

> db.documents.stats()
{
    "ns" : "profiler.documents",
    "count" : 1302957,
    "size" : 23063622656,
    "avgObjSize" : 17700.985263519826,
    "storageSize" : 25188048768,
    "numExtents" : 31,
    "nindexes" : 2,
    "lastExtentSize" : 2146426864,
    "paddingFactor" : 1,
    "systemFlags" : 1,
    "userFlags" : 0,
    "totalIndexSize" : 3432652720,
    "indexSizes" : {
        "_id_" : 42286272,
        "mentions.mention_1" : 3390366448
    },
    "ok" : 1
}
> db.mentions.stats()
{
    "ns" : "profiler.mentions",
    "count" : 97458884,
    "size" : 15299979084,
    "avgObjSize" : 156.98906509128506,
    "storageSize" : 17891127216,
    "numExtents" : 29,
    "nindexes" : 3,
    "lastExtentSize" : 2146426864,
    "paddingFactor" : 1,
    "systemFlags" : 0,
    "userFlags" : 0,
    "totalIndexSize" : 15578411408,
    "indexSizes" : {
        "_id_" : 3162125232,
        "mention_1" : 4742881248,
        "url_1" : 7673404928
    },
    "ok" : 1
}

誰かがなぜこれが起こっているのか教えていただければ幸いです。:]

4

1 に答える 1

0

メンションには 1 億のドキュメントがあり、ドキュメントには 130 万のドキュメントがあります。

ドキュメントとメンションの両方にメンションを保存するとおっしゃっていたので、両方のインデックスに同じ数のインデックス エントリがあります。

したがって、インデックス アクセス時間同じです。これを測定する方法は、カバーされたインデックス クエリを両方から実行することです。つまり、インデックスに格納されている値のみを取得したいということです。 db.x.find({url:"xxx"}, {_id:0, "url":1})一致するドキュメントを見つけて、そこから url の値のみを返すと言います。これら 2 つの値が 2 つの接続間で等しくない場合は、セットアップに異常があるか、インデックスの 1 つが RAM に収まらないか、別の測定関連の問題である可能性があります。

これらの 2 つが同じであるが、ドキュメント コレクションでのドキュメントのフェッチが一貫して高速である場合、その理由を確認します。完全な Explain 出力により、時間が費やされている場所を示すことができます。また、一方のコレクションが他方よりも多く RAM に存在するかどうかを確認します。 、 例えば。

于 2013-09-06T04:28:02.303 に答える