【发布时间】:2016-01-25 22:48:27
【问题描述】:
我有一个关于集合大小和查询性能的问题 –
有 2 个 db——DB1 和 DB2。 DB1 有 1 个集合,这是 stats() 对这个集合的输出——
{
…
"count" : 2085217,
"size" : 17048734192,
"avgObjSize" : 8176,
"capped" : false,
"nindexes" : 3,
"indexDetails" : {},
"totalIndexSize" : 606299456,
"indexSizes" : {
"_id_" : 67664576,
"id_1" : 284165056,
"id_2" : 254469824
},
…
}
使用索引 id_1 对该集合的查询在 0.012 秒内返回。这是 explain() 的输出 -
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 0,
"totalKeysExamined" : 1,
"totalDocsExamined" : 1,
….
"indexName" : "id_1",
}
在 DB2 中,我有 4 个集合,这是 DB2 上的 stats 的输出 -
{
…
"collections" : 4,
"objects" : 152655935,
"avgObjSize" : 8175.998307514215,
"dataSize" : 1248114666192,
"storageSize" : 1257144933456,
"indexes" : 12,
"indexSize" : 19757688272,
"fileSize" : 1283502112768,
…
}
使用索引对 DB2 中的任何集合进行查询(我通过 explain() 确认)所花费的时间至少是上一次针对 DB1 查询所用时间的两倍。
既然 mongo 应该可以很好地扩展,为什么会有这种差异?我读到 mongodb 将所有索引加载到内存中,并且由于 DB2 的容量比 DB1 大,这就是为什么它需要更长的时间吗?
任何见解都会非常有帮助。谢谢。
编辑 1: 添加更多信息。集合定义、索引定义和执行的查询...
所有集合(在两个数据库中)都包含相同的字段;它们之间只有文档的值和大小不同。
还有,这是相关的索引 -
"1" : {
"v" : 1,
"unique" : true,
"key" : {
"id" : 1
},
"name" : "id_1",
"ns" : "ns.coll1"
}
而且,这就是 id 字段的样子:
"_id" : ObjectId("55f9b6548aefbce6b2fa2fac"),
"id" : {
"pid" : {
"f1" : "val1",
"f2" : "val2"
}
},
还有,这是一个示例查询 -
db.coll1.find({id:{pid:{f1:"val1",f2:"val2"}}})
编辑 2: 以下是有关硬盘和 RAM 的更多信息 -
$ free -m
total used free shared buff/cache available
Mem: 386758 3750 1947 25283 381060 355675
Swap: 131071 3194 127877
硬盘3.5T左右,其中2.9T已经用完了。
【问题讨论】:
-
你能提供更多细节吗?集合定义、索引定义和查询是否执行?
-
我编辑了上面的原始帖子以添加更多信息。谢谢。
-
如果没有足够的 RAM 存储热数据,查询会很慢,因为需要访问磁盘。
-
我更新了我的帖子,包括内存信息。究竟什么是热点数据?它是查询所针对的整个集合,还是仅仅是索引?如果是后者,我是否应该确保 RAM 中的可用空间足够大以支持集合的 indexSize?谢谢。