上限收集性能问题

时间:2013-01-18 04:44:53

标签: mongodb

我正在做一些测试,看看我可以从Mongodb获得什么样的吞吐量。文档说,上限集合是最快的选择。但我经常发现我可以更快地写入正常的集合。根据确切的测试,我通常可以通过正常的集合获得两倍的吞吐量。

我错过了什么吗?我该如何解决这个问题?

我有一个非常简单的C ++程序,它尽可能快地将64,000个文档写入集合。我记录了总时间和我等待数据库的时间。如果我只更改集合名称,我可以看到上限和普通集合之间的明显区别。

> use tutorial
switched to db tutorial
> db.system.namespaces.find()
{ "name" : "tutorial.system.indexes" }
{ "name" : "tutorial.persons.$_id_" }
{ "name" : "tutorial.persons" }
{ "name" : "tutorial.persons.$age_1" }
{ "name" : "tutorial.alerts.$_id_" }
{ "name" : "tutorial.alerts" }
{ "name" : "tutorial.capped.$_id_" }
{ "name" : "tutorial.capped", "options" : { "create" : "capped", "capped" : true, "size" : 100000000 } }
> db.alerts.stats()
{
    "ns" : "tutorial.alerts",
    "count" : 400000,
    "size" : 561088000,
    "avgObjSize" : 1402.72,
    "storageSize" : 629612544,
    "numExtents" : 16,
    "nindexes" : 1,
    "lastExtentSize" : 168730624,
    "paddingFactor" : 1,
    "systemFlags" : 1,
    "userFlags" : 0,
    "totalIndexSize" : 12991664,
    "indexSizes" : {
        "_id_" : 12991664
    },
    "ok" : 1
}
> db.capped.stats()
{
    "ns" : "tutorial.capped",
    "count" : 62815,
    "size" : 98996440,
    "avgObjSize" : 1576,
    "storageSize" : 100003840,
    "numExtents" : 1,
    "nindexes" : 1,
    "lastExtentSize" : 100003840,
    "paddingFactor" : 1,
    "systemFlags" : 1,
    "userFlags" : 0,
    "totalIndexSize" : 2044000,
    "indexSizes" : {
        "_id_" : 2044000
    },
    "capped" : true,
    "max" : 2147483647,
    "ok" : 1
}

linux版本:3.4.11-1.fc16.x86_64

mongo version:db version v2.2.2,pdfile version 4.5

这是一台专用机器,只运行Mongodb服务器和我的测试客户端。这台机器的测试结果非常荒谬。

2 个答案:

答案 0 :(得分:3)

我看到了问题。我上面引用的网页说,“没有索引”的上限集合将提供高性能。但...

http://docs.mongodb.org/manual/core/indexes/说“在版本2.2封顶集合之前没有_id字段。在2.2中,所有封顶集合都有一个_id字段,除了本地数据库中的字段。”

我创建了另一个版本的测试,它写入本地数据库中的上限集合。果然,这个系列没有任何索引,我的吞吐量要高得多!

http://docs.mongodb.org/manual/core/capped-collections/处对上限集合进行概述可能会澄清这一点。

答案 1 :(得分:1)

  

加盖的集合保证了插入顺序的保留。作为一个   结果,查询不需要索引来插入插入文档   订购。如果没有这种索引开销,它们可以支持更高   插入吞吐量。

根据上面的定义,如果您没有任何索引插入到上限集合,则不必比插入到普通集合更快。因此,如果你没有任何索引,如果你没有任何其他理由去使用封顶集合,例如缓存,那么显示最后n个元素类型,我建议你去定期收藏。

  

加盖的集合保证插入顺序与   在磁盘上订购(自然顺序)并通过禁止更新来执行此操作   增加文件大小。上限集合仅允许适合的更新   原始文档大小,确保文档不会更改   它在磁盘上的位置。