DB复合索引最佳实践 Mongo DB

4
索引MongoDB中的某些字段有多么昂贵?
我有一张表,想要通过组合两个字段实现唯一性。在所有查询中,他们都建议使用复合索引并将唯一设置为true。但是我的做法是“将field1_field2追加在一起,并使其成为关键字,以便field2始终对于field1唯一(然后添加应用程序逻辑)”。因为我认为索引代价很高。
此外,由于MongoDB文档建议我们不要使用自动递增数字等自定义对象ID,所以我给模型(如类、学生等)分配了大数字(在sql lite中可以轻松使用1,2,3)。我没有考虑添加一个新字段进行编号并将该字段索引以进行查询。
生产环境下的最佳实践建议是什么?
1个回答

2
使用复合索引而不是自己建立的索引字段系统的优点在于,复合索引允许更快地排序比常规索引字段。它还可以降低每个文档的大小。
在您的情况下,如果您想按升序获取具有field1值和按降序排列的field2值的文档,则最好使用复合索引。如果您只想获取具有包含在field1_field2中的某些特定值的文档,则使用复合索引或常规索引字段都无关紧要。
但是,如果您已经在文档中拥有field1field2分开的字段,并且还有一个包含field1_field2的字段,则最好在field1field2上使用复合索引,并简单删除包含field1_field2的字段。这可以降低每个文档的大小,并最终减小数据库的大小。
关于索引成本,如果您无论如何都想走这条路,就几乎必须对field1_field2进行索引。基于未索引字段的查询在MongoDB中非常缓慢。当文档具有索引字段时,将文档添加到数据库并不需要太长时间(我们谈论的是1毫秒左右)。请注意,对许多现有文档添加索引可能需要几分钟。这就是为什么通常在添加任何文档之前都要计划索引策略。
总之:
如果您有限的磁盘空间或需要排序结果,请使用复合索引并删除field1_field2。否则,请使用field1_field2,但必须对其进行索引!

我的要求只是避免重复键,field1 是学校 ID,field2 是学生的学号,任何学校都不应该有重复的学号。对于查询,我想将我的文档的 ObjectId 传递给所有客户端,这样每当他们请求时,他们就会拥有 ObjectID,但这样做,我必须在每个请求中始终发送“roll_number 字段和 Object Id”。在生产中,索引字段比在每个请求中添加额外字符串更好吗? - Bikash
我不确定是否完全理解你的意见,但这是我的答案:通常情况下,你不应该使用自定义的ObjectID。最终,你可能会意识到你的数据模型不正确,需要进行更改。如果你使用了自定义ObjectID,那么在适应新的数据模型时可能需要对其进行修改。而标准的ObjectID是与数据模型无关的,无论文档内容如何,它都是一个很好的选择。标准的ObjectID还包含许多有用的信息 - Cydrick Trudel
您提到您的主要关注点是避免键重复。因此,我建议避免使用包含“SchoolID_StudentRollNumber”的索引字段,因为它是“SchoolID”和“StudentRollNumber”字段的重复。我会将这两个字段分开,但使用一个复合索引。这两个字段仍然与“ObjectID字段”不同,后者将是常规的ObjectID。然后,当您想要查询服务器时,您将向所有客户端发送“SchoolID”和“StudentRollNumber”。您的客户端将使用这两个字段进行查询。 - Cydrick Trudel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接