【问题标题】:MongoDB gridFS - filename length, indexing, performanceMongoDB gridFS - 文件名长度、索引、性能
【发布时间】:2012-02-17 11:17:12
【问题描述】:

我正在学习 gridFS,我有几个问题。

1) gridFS 通过生成的_id 自动索引文件。但大多数时候我都是通过文件名获取文件,所以我应该自己在“文件名”上创建索引吗?

2) gridFS 没有文件夹,只有文件名,但我可以通过使用带有斜杠“/images/avatars/35.jpg”的文件名来模仿文件夹,对吧?

3) 如果我在“文件名”上编制索引 - 在性能方面使用短文件名会更好吗?我的意思是 - 如果我使用 24 个符号长 + 后缀的用户 _id,例如 "/images/avatar_4f1d36b58e42ba3836ed178e_t.jpg",那么在这么长的字段上建立索引不会减慢我的系统吗?使用短用户登录而不是 _id 会更好(更快)吗?

【问题讨论】:

    标签: performance mongodb indexing gridfs


    【解决方案1】:

    1) 如果文件名没有被索引,我会感到非常惊讶。它在整个 API 中都使用过,我假设它已编入索引。

    2) 是的,你可以,但没有隐含的目录的真正概念。列出文件/目录有点复杂。换句话说,它只是一个标签。

    3) 索引使用散列或固定长度的字符串,因此长键与长键一样容易索引。

    【讨论】:

      【解决方案2】:

      1) 规范不要求对文件名进行索引。您可能想检查驱动程序中的代码,或者自己创建一个索引。您应该考虑的一件事是文件名不必是唯一的。您可能会重新考虑您的设计,并改为查询 _id。

      2) 是的。

      3) mongodb 中的 b-tree 索引不使用哈希。较大的字符串将在索引中占用更多空间,从而占用更多 RAM,但我认为性能不会受到太大影响(除非您将使用更多 RAM 视为性能受到影响)。 mongodb 的一个好的经验法则是您的索引(和您的“工作集”)应该适合 RAM。如果您可以修改您的应用程序以查询 _id 而不是文件名,您就不必担心该索引的空间。

      【讨论】:

      • 谢谢!我已经发现文件名在 gridFS 中并不是唯一的,它仍然让我感到困惑。如果我想覆盖用户的头像 - 我应该首先搜索并删除其以前的版本,否则我将在 DB 中获得两个头像。不过,有时它可能会很方便。
      • 我还发现:“索引条目的最大大小(值的总和)有限制,目前大约为 800 字节。字段值(索引术语中的键大小)大于无法索引此大小。” - mongodb.org/display/DOCS/…
      • 是的。他们将很快修复 800 字节的限制。不久前,我自己遇到了它,试图在子文档上建立索引。您的文件名方案不应该让您接近 800 字节,因此您应该可以在该字段上使用索引。
      【解决方案3】:

      GridFS 在_id 上有一个默认索引(显然),在filenameuploadDate 上有一个复合索引。

      【讨论】:

        猜你喜欢
        • 2013-07-19
        • 2016-01-01
        • 2012-03-29
        • 1970-01-01
        • 2017-02-07
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 2016-07-10
        相关资源
        最近更新 更多