我有一个我正在更新的集合添加一个新字段。 该文件如下:
{"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"?
的系统索引更快答案 0 :(得分:2)
添加索引所需的时间取决于您的硬件,但是对于20206记录,您描述的简单索引对于大多数硬件来说不应该花费很长时间。
索引完全覆盖的查询(即指定A和B的位置,或只是A,但不只是B - 索引从左到右覆盖,因此除非您在选择中包含A,否则索引不能被使用)检索结果会快得多。除非您按_id搜索,否则_id上的默认索引根本不会帮助您;对A和B的查询必须在没有建议索引的情况下执行完整的集合扫描,这比索引扫描慢几个数量级。
因为索引也需要更新,所以插入会稍微慢一些,但是再次使用相对较少的总文档,这可能是一个很大的开销。
如果您使用A和B来识别要更新的文档,那么更改C集合的更新可能会更快,因为它们将从更快的搜索中受益,并且一旦找到数据,更新不应受到影响索引不需要改变。
由于绝对性能将特定于您的硬件,如果您关注它,最好的办法是在数据副本上(在类似的硬件上)尝试并测量性能是否符合您的要求需要。 output from explaining the query可以帮助您了解索引如何影响查询性能。
答案 1 :(得分:0)
嗯,创建索引所需的时间完全取决于您使用的硬件(系统)和记录数。对于~20K记录,它应该快速而不需要花费更多时间。在最坏的情况下最多几秒钟。很少主题,但我发现你已经给出了背景真实的选项,可能它不需要,因为在创建一个非常大的数据集时使用这些背景选项。请在创建索引时考虑一些事情,不仅仅是针对这个问题,而是一般情况下。
- $