Вот так выглядит моя база данных:
> 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" : [
.................
]
}
В упоминаниях 100 миллионов документов и 1,3 миллиона в документах. Каждое упоминание, появляющееся в mentions
, также должно один раз появляться в массиве mentions
некоторого document
. Причина, по которой я сохраняю информацию об упоминаниях в документах, заключалась в том, чтобы не обращаться к упоминаниям для извлечения контекста. Тем не менее, когда я запрашиваю только упоминания, я подумал, что будет быстрее иметь независимую коллекцию, mentions
.
Однако после того, как я поэкспериментировал с индексом как для mentions.url
/mentions.mention
, так и для documents.mentions.url
/documents.mentions.mention
и запросил один и тот же URL/упоминание в обеих коллекциях, я обнаружил, что получить ответ из коллекции документов было в два раза быстрее, чем из коллекции упоминаний.
Я не уверен, как индекс работает внутри, но я предполагаю, что оба индекса имеют одинаковый размер, поскольку в обеих коллекциях одинаковое количество упоминаний. Таким образом, они должны иметь одинаковое время отклика?
Я пытался что-то вроде
> 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" : "----:----"
}
И статистика (ага, я восстановил коллекцию и еще не проиндексировал document.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
}
Буду признателен, если кто-нибудь скажет мне, почему это происходит. :]
collection.stats()
, который я только что добавил к вопросу, размер индексаmention_1
более чем на 1/3 больше, чем уmentions.mention_1
. И когда я делаюwatch -n 1 free -m
, кажется, что запрос колл упоминаний занимает вдвое больше места в ОЗУ, чем колл документов. 07.09.2013db.documents.find({"mentions.mention":"China"}, {_id:1}).explain()
даетmills: 98502
, аdb.mentions.find({"mention":"China"}, {_id:1}).explain()
даетmills: 134932
. Смущенный. 07.09.2013