在包含大量数据的MongoDB数据库上添加索引有什么影响?

时间:2014-06-17 14:47:09

标签: mongodb indexing

我有一个包含数百万条推文的MongoDB数据库,为了提高查询性能,我需要添加一个或多个额外的复合索引。字段中已有单独的索引将进入复合索引。在我添加这些索引之前,我想知道影响将是什么,短期(是否需要几天才能添加初始索引?)和长期(是否会使插入变得足够慢)它超过了加速查询的好处吗?)

这不是生产数据库 - 没有副本,没有分片。它存在于一个低端的Linux机器上,如果有的话,它不会运行太多。正如我所说,数以百万计的推文。相关字段是userid和tweeted_at(日期)。机器上有足够的可用空间,我没有任何地方可以放置我的数据库的副本,所以在副本上试一试并不是真的有用。我不指望确切的答案,只是一些指导。

2 个答案:

答案 0 :(得分:2)

  1. 创建索引基本上会锁定您的数据库 - 没有读取,也没有写入。
  2. 可以通过{background:true}选项在后台创建索引。然而,这是一种非常糟糕的想法,因为它会大大减慢索引创建的速度
  3. 查询数量级会更快。如果超过(小)写入性能的损失在很大程度上取决于您的应用程序。如果你偶尔阅读,可能是浪费时间。根据我的经验,除了非常特殊的应用程序之外,它通常是值得的。假设您将对数据或某种map / reduce操作进行某种聚合,我会说这样做。
  4. MongoDB非常快速有效。我只是在同一台机器上设置了一个分片集群(2个独立分片,一个配置服务器和一个mongos - 我负载很重的MacBook Air,同时编译一个Spring应用程序)并在2个值上创建一个复合索引1M文档花了大约16秒。即使我们假设每个mongod使用一个CPU并且处理是并行完成的,磁盘也是限制因素。我认为,假设我们宁愿谈的是几分钟而不是几小时,更不用说几天了。
  5. 编辑:为了加快速度,你可能想要设置noatime标志来重新安装相应的分区。

答案 1 :(得分:0)

您的数据库包含数百万条推文不一定是个问题。正如马库斯所说,它有可能使你的查询停止,特别是如果你没有分片。

我所经历的最重要的额外事情(使用10和100万条记录)并不是记录的数量和那些记录的大小一样多。当我处理超过一百万条记录的TB数据时,它比100亿条记录中的100GB数据要快得多。

实际里程数会有所不同,但我认为推文数据库的记录足够小,索引应该相对较短,并且不应该为文档创建添加有意义的时间。