【问题标题】:Mongodb- embedded vs IndexesMongodb-嵌入式与索引
【发布时间】:2012-02-21 20:38:24
【问题描述】:

我的问题很简单。我正在使用 mongodb 构建我的第一个应用程序。到目前为止,我一直使用 sql。我已经阅读了很多关于嵌入文档与链接文档的信息。

我对 mongodb 资深人士的问题是:如果我使用与嵌入式文档对应的索引链接/查询,速度/性能是否会有巨大差异?如果有很大的不同,你能解释一下为什么吗?谢谢。

再次,我是 mongodb 的新手,只是不想走错路。谢谢你。

【问题讨论】:

    标签: mongodb indexing


    【解决方案1】:

    是的,参考文献和嵌入式文档之间存在巨大差异。

    嵌入的文档与文档的其余字段存储在in相同的磁盘位置,因此在查询时无需额外的网络往返或磁盘搜索来检索嵌入的文档整个文档。

    另一方面,DBRefs 只是另一个集合中文档的 _id。获取“链接”文档将需要额外的往返和额外的磁盘搜索。在此处查看 DBRefs 的规范:

    http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-DBRef

    您应该尝试通过在单个文档中包含满足该查询所需的所有信息来优化您最常见的查询。

    【讨论】:

    • 后续问题是嵌入式文档是否有自己的大小限制,还是会增加父文档的大小?我担心如果嵌入所有文档,那么父文档可能会达到大小限制?这是可能的还是我不必担心的事情?谢谢。
    • 例如,如果我正在构建一个联系人列表。我有一个名为 users 的父文档,该用户文档嵌入了名为“contacts”的文档。如果用户有 50,000 个联系人,这会不会有问题?这会导致尺寸问题。或者更好的是,假设用户正在跟踪所有嵌入到用户文档中的“联系人”、“交易”、“日期”等。如果他们有 50,000 个联系人、10,000 个交易、30,000 个日期/约会等,这可能会使父/用户文档变得庞大。请告知。谢谢。
    • 好的,另一个问题是如果嵌入了事物,那么您将无法跨记录运行报告。例如,假设每个父记录都嵌入了交易记录,并且您想为公司中的所有交易(不是特定于用户)运行报告,如果它们被嵌入,这将不容易做到。对吗?
    • 是的,嵌入式文档包含在整个文档的大小限制中。不过,在大多数合理的应用程序中,您不会遇到 16MB 的文档大小。 King James Bible 是 4MB 的纯文本。
    • 至于报告——我建议您对文档进行结构化,以便最常见的查询很快。您可以在嵌入式文档上运行报告,您只需要在应用程序代码中做一些工作。例如,要计算联系人总数,在 Python 中:sum(len(user['contacts']) for user in db.users.find()) 与 SQL 不同,MongoDB 的查询语言并非旨在完成所有聚合数据的工作,一些复杂报告的逻辑将在您的应用程序代码中。 MongoDB 2.1 的聚合框架将使更复杂的报表在数据库本身成为可能。 db.users
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2012-03-20
    • 2012-09-03
    • 1970-01-01
    • 2012-12-20
    相关资源
    最近更新 更多