【问题标题】:Mongo dbs of 5M and 150M webpages is really really slow5M和150M网页的Mongo dbs真的很慢
【发布时间】: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


【解决方案1】:

正如 Neil Lunn 在上面的 cmets 中指出的那样。我发现最简单的解决方案是从头开始创建数据库,同时使用 _id 作为我的 id 字段名称而不是 "id"_id 默认有一个索引,唯一会针对这个索引发出的查询是按 id 检索。

因此,程序(用于创建索引的任何程序)将插入对象,如下所示:

db.collection.insert( { _id: "aw-000", page: "...", .... } )

代替:

db.collection.insert( { id: "aw-000", page: "...", .... } )

【讨论】:

    猜你喜欢
    • 2016-09-09
    • 2017-11-10
    • 2010-12-28
    • 2013-01-25
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    相关资源
    最近更新 更多