更新文档时创建索引

Creating index while updating the documents

我有一个集合,我正在更新添加一个新字段。 文件看起来像:

{"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”的系统索引更快?

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

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

插入速度会稍微慢一些,因为索引也需要更新,但同样由于文档总数相对较少,这不太可能是一个很大的开销。

如果您使用 A 和 B 来确定要更新哪个文档,则更改 C 集合的更新可能会更快,因为它们将受益于更快的搜索,并且一旦数据更新,更新应该不会受到影响发现索引不需要更改。

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

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

  1. 当您在 foreground 中创建索引时,它们会阻止操作并且不允许读取操作,并且使用 background true 的原因。 http://docs.mongodb.org/v2.2/administration/indexes/
  2. 前台索引创建的好处是索引更紧凑,与后台相比更好。因此它应该是首选。
  3. 好消息已经过去很久了 运行,后台索引创建和前台索引创建都提供相同的性能,并且创建索引的方式无关紧要。 ...快乐 Mongoing.. ;-)

-$