更新文档时创建索引

时间:2015-06-23 07:43:58

标签: mongodb indexing

我有一个我正在更新的集合添加一个新字段。 该文件如下:

{"A": "P145", "B":"adf", "C":[{"df":"14", "color":"blue"},{"df":17}], 
     "_id":ObjectID(....), "Synonyms":{"Synonym1": "value1", 
          "Synonym2": ["value1", "value2"]}}

在更新中,我将新元素添加到C

我想在字段A和B上创建索引.A和B是20206个唯一字段。对数据库的查询将基于这些字段。 " _id"默认设置。

我打算用collection.ensure_index({"A":1, "B":1}, background=True)

来做

需要多长时间?它会比基于" _id"?

的系统索引更快

2 个答案:

答案 0 :(得分:2)

添加索引所需的时间取决于您的硬件,但是对于20206记录,您描述的简单索引对于大多数硬件来说不应该花费很长时间。

索引完全覆盖的查询(即指定A和B的位置,或只是A,但只是B - 索引从左到右覆盖,因此除非您在选择中包含A,否则索引不能被使用)检索结果会快得多。除非您按_id搜索,否则_id上的默认索引根本不会帮助您;对A和B的查询必须在没有建议索引的情况下执行完整的集合扫描,这比索引扫描慢几个数量级。

因为索引也需要更新,所以插入会稍微慢一些,但是再次使用相对较少的总文档,这可能是一个很大的开销。

如果您使用A和B来识别要更新的文档,那么更改C集合的更新可能会更快,因为它们将从更快的搜索中受益,并且一旦找到数据,更新不应受到影响索引不需要改变。

由于绝对性能将特定于您的硬件,如果您关注它,最好的办法是在数据副本上(在类似的硬件上)尝试并测量性能是否符合您的要求需要。 output from explaining the query可以帮助您了解索引如何影响查询性能。

答案 1 :(得分:0)

嗯,创建索引所需的时间完全取决于您使用的硬件(系统)和记录数。对于~20K记录,它应该快速而不需要花费更多时间。在最坏的情况下最多几秒钟。很少主题,但我发现你已经给出了背景真实的选项,可能它不需要,因为在创建一个非常大的数据集时使用这些背景选项。请在创建索引时考虑一些事情,不仅仅是针对这个问题,而是一般情况下。

  1. 前景中创建索引时,它们会阻止操作,并且不允许读取操作,并且使用原因背景为true。 http://docs.mongodb.org/v2.2/administration/indexes/
  2. 前景索引创建的好处是索引更紧凑,与背景相比更好。因此应该是首选。
  3. 好消息是长期运行,后台索引创建和前台提供相同的性能,并且无论索引创建的方式都是如此。 ...快乐的蒙古..; - )
  4. - $