【问题标题】:DB Compound indexing best practices Mongo DBDB Compound 索引最佳实践 Mongodb
【发布时间】:2016-07-10 20:38:06
【问题描述】:

在 MongoDB 中索引某些字段的成本是多少,

我有一个表,我希望在其中结合两个字段的唯一性,在我搜索的每个地方,他们都建议将唯一设置为 true 的复合索引。但我所做的是“同时添加 field1_field2 并使其成为键,因此 field2 对于 field1 将始终是唯一的。(并添加应用程序逻辑)因为我认为索引成本很高。

而且 MongoDB 文档建议我们不要使用自定义对象 ID,如自动递增数字,我最终为类、学生等模型提供了大数字(我可以在 sql 中轻松使用 1、2、3 lite),我没想到要添加一个新字段来编号和索引该字段以进行查询。

生产的最佳实践建议是什么

【问题讨论】:

    标签: mongodb indexing database-schema database


    【解决方案1】:

    与您自己的索引字段系统相比,使用复合索引的优势在于,复合索引允许比常规索引字段更快地进行排序。它还减小了每个文档的大小。

    在您的情况下,如果您想使用field1 升序和field2 降序对文档进行排序,最好使用复合索引。如果您只想获取包含在field1_field2 中的特定值的文档,那么使用复合索引或常规索引字段并不重要。

    但是,如果您在文档的单独字段中已经有 field1field2,并且您还有一个包含 field1_field2 的字段,则最好在 field1 和 @987654329 上使用复合索引@,然后简单地删除包含field1_field2 的字段。这可以减小每个文档的大小,并最终减小数据库的大小。

    关于索引的成本,如果你想沿着这条路线走,你几乎必须索引field1_field2。基于 MongoDB 中未索引字段的查询真的很慢。当文档具有索引字段时(我们说的是 1 毫秒左右),将文档添加到数据库不会花费更多时间。请注意,在许多现有文档上添加索引可能需要几分钟时间。这就是为什么您通常在添加任何文档之前计划索引策略的原因。

    TL;DR:

    如果您的磁盘空间有限或需要对结果进行排序,请使用复合索引并删除 field1_field2。否则,使用field1_field2,但它必须被索引!

    【讨论】:

    • 我的要求只是为了避免重复键,field1 是说学校 id,field2 是学生卷号,没有学校应该有重复的卷号,为了查询,我想将我的 Document 的 ObjectId 传递给我所有的客户,所以每当他们请求时,他们都会拥有 ObjectID,但是这样做,我必须始终在我的每个请求中将“roll_number 字段和对象 ID”发送到服务器。在生产中索引字段是否比在每个请求中添加额外的字符串更好的方法
    • 我不确定是否完全理解您的评论,但这是我的回答:通常,您不想使用自定义 ObjectID。最终,您可能会意识到您的数据模型不正确,需要对其进行更改。如果您使用了自定义 ObjectID,则可能需要对其进行更改以使其适合您的新数据模型。常规的 ObjectID 与数据模型无关,无论文档包含什么,它都是一个很好的候选对象。常规 ObjectID 还包含 many useful informations
    • 您提到您最关心的是避免密钥重复。在此之后,我将避免使用包含SchoolID_StudentRollNumber 的索引字段,因为它是字段SchoolIDStudentRollNumber 的重复。我只是将这两个字段分开,但使用复合索引。这两个字段仍然与ObjectID field 不同,后者将是一个常规的 ObjectID。然后,当您想查询您的服务器时,您可以将SchoolIDStudentRollNumber 发送给您的所有客户端。然后,您的客户将使用这两个字段进行查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2022-01-22
    • 2019-10-19
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多