Mongodb DB复合索引最佳实践Mongo DB

Mongodb DB复合索引最佳实践Mongo DB,mongodb,indexing,database-schema,database,Mongodb,Indexing,Database Schema,Database,在MongoDB中索引某些字段的成本有多高 我有一个表,其中我希望唯一性组合两个字段,在每个地方我搜索他们建议的复合索引,唯一性设置为true。但我所做的是“添加field1_field2并使其成为一个键,这样field2对于field1总是唯一的(并添加应用程序逻辑),因为我认为索引是昂贵的 此外,正如MongoDB文档建议我们不要使用自定义对象ID(如自动递增的数字),我最终给了类、学生等模型很大的数字(在SQLLite中我可以轻松地使用1,2,3),我没有想到要添加一个新的字段进行编号,并

在MongoDB中索引某些字段的成本有多高

我有一个表,其中我希望唯一性组合两个字段,在每个地方我搜索他们建议的复合索引,唯一性设置为true。但我所做的是“添加field1_field2并使其成为一个键,这样field2对于field1总是唯一的(并添加应用程序逻辑),因为我认为索引是昂贵的

此外,正如MongoDB文档建议我们不要使用自定义对象ID(如自动递增的数字),我最终给了类、学生等模型很大的数字(在SQLLite中我可以轻松地使用1,2,3),我没有想到要添加一个新的字段进行编号,并为该字段编制索引进行查询


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

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

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

但是,如果文档中的不同字段中已经有
field1
field2
,并且还有一个包含
field1\u field2
的字段,最好在
field1
field2
上使用复合索引,只需删除包含
field1\u field2
的字段即可减小每个文档的大小,并最终减小数据库的大小

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

TL;DR:


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

我的要求只是为了避免重复键,field1表示学校id,field2表示学生学籍号,任何学校都不应该有重复的学籍号,对于查询,我想将文档的ObjectId传递给我的所有客户机,这样每当他们请求时,他们都会得到ObjectId,但这样做时,我必须始终发送“roll_number”字段和对象Id“在我对服务器的每个请求中。在生产中,索引字段比在每个请求中添加额外字符串更好吗?我不确定是否完全理解您的评论,但我的答案是:通常,您不想使用自定义objectid。最终,您可能会意识到您的数据模型不正确,需要对其进行更改。如果使用自定义ObjectID,则可能需要对其进行更改以使其适合新的数据模型。常规ObjectID是数据模型不可知的,因此无论文档包含什么,它都是一个很好的候选对象。常规ObjectID还包含您提到的主要问题是避免密钥重复。接下来,我将避免使用包含
SchoolID\u StudentRollNumber
的索引字段,因为它是
SchoolID
StudentRollNumber
字段的重复。我只需要将这两个字段分开,但使用复合索引。这两个字段仍将不同于
ObjectID字段
,后者将是常规ObjectID。然后,当您想要查询服务器时,您会将
SchoolID
StudentRollNumber
发送给所有客户端。然后,您的客户机将使用这两个字段进行查询。