7

查找索引是否驻留在 RAM 或 MongoDB 磁盘中的最佳方法是什么?

4

2 回答 2

5

一方面,完全有可能只有索引的某些部分在 RAM http://docs.mongodb.org/manual/applications/indexes/#indexing-right-handed

索引不必在所有情况下都完全适合 RAM。如果索引字段的值随着每次插入而增长,并且大多数查询选择最近添加的文档;那么 MongoDB 只需将索引中包含最新或“最右边”值的部分保留在 RAM 中。这允许有效地使用索引进行读取和写入操作,并最大限度地减少支持索引所需的 RAM 量。

另一方面,db.serverStatus()为您提供所需信息的汇总。检查http://docs.mongodb.org/manual/reference/server-status/#server-status-indexcounters

indexCounters.btree.hits值反映了索引被访问的次数,并且 mongod 能够从内存中返回索引。

于 2012-11-25T14:35:06.043 回答
1

是的,有办法。您可以使用totalIndexSize()or stats() 来检查索引的大小

> db.collection.totalIndexSize()
> 1073741824


> db.collection.stats()
> {
"ns" : "collection.test",
"count" : 100006,
"size" : 72104,
"avgObjSize" : 4506.5,
"storageSize" : 688128,
"numExtents" : 3,
"nindexes" : 1,
"lastExtentSize" : 524288,
"paddingFactor" : 1.0170000000000319,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 1073741824,
"indexSizes" : {
    "_id_" : 1073741824
},
"ok" : 1

两者都将以字节为单位返回集合的索引大小。上例显示索引大小为1GB.

更新

要查找整个数据库的总索引大小,可以使用stats()

 > db.stats()
{
    "db" : "test",
    "collections" : 10,
    "objects" : 5909990,
    "avgObjSize" : 2888.31186440677965,
    "dataSize" : 170123304,
    "storageSize" : 14745603499,
    "numExtents" : 17,
    "indexes" : 8,
    "indexSize" : 1073741824,
    "fileSize" : 50331648,
    "nsSizeMB" : 163453,
    "ok" : 1
}

现在您可以indexSize与机器 RAM 进行比较,以检查索引是否适合内存。您可以增加 RAM 大小以容纳完整索引。

希望能帮助到你

于 2012-11-25T14:42:57.463 回答