【发布时间】:2017-07-19 16:56:20
【问题描述】:
我将一组网页存储在 mongodb 中,大约 150M 个网页。每页大小不同。我想做的唯一事务是使用它们的 id(不是 mongodb 默认 _id)检索页面。但是,获得结果确实需要很长时间,而且我还没有设法检索任何文档。但是,使用 db.collection.findOne() 效果很好。因此,我索引了 5M 网页的子集以进行测试和修复。查询此 db db.collection.find("id":"aw-000") 时,需要 4 分钟或更长时间才能获取文档。
我尝试了db.runCommand({compact: 'collection'}) 和db.runCommand({compact: 'collection'}) m 但它们没有帮助!
当我检查var/log/mongodb/mongod.log 下的日志时(应该包含任何花费超过 100 毫秒的查询),我发现:
655163:2017-07-16T14:05:37.231+0300 I COMMAND [ftdc] serverStatus was very slow: { after basic: 0, after asserts: 0, after connections: 0, after extra_info: 310, after globalLock: 310, after locks: 310, after network: 310, after opcounters: 310, after opcountersRepl: 310, after storageEngine: 310, after tcmalloc: 310, after wiredTiger: 310, at end: 1220 }
但是,我不知道如何从这些日志中受益。
有没有办法让我的数据库更有效率?
【问题讨论】:
-
你有
id的索引吗? -
或者你有没有想过将你的“自己的独特价值”提供给
_id?因为没有什么说它“必须”包含ObjectId。当然,现在使用它会涉及重写整个集合。但这应该是一个带有$project和$out的简单聚合管道。但听起来你基本上只是忘了添加索引。 -
@JohnnyHK 对于我只需要使用自己的 id 字段从 db 检索文档的情况,您会建议哪种类型的索引。我实际上为我自己的 id 字段创建了唯一索引,但这并没有提高我的查询响应时间。我阅读了文档,但他们不推荐任何内容。
-
@Neil Lunn 如果我没听错的话,你的意思是我不必添加名为 id 的属性,因为 mongodb 具有名为 _id 的默认属性。为此,我认为这取决于我正在使用的应用程序和数据;在我的例子中,我使用了我自己的 id,因为它反映了我的爬网,每个网页都有自己的,由我的团队开发的应用程序使用。
标签: mongodb