2014-06-17 102 views
2

我有一个MongoDB数据库,其中包含数以百万计的tweets,看起来要提高查询性能,我需要添加一个或多个额外的复合索引。已经有多个字段的索引会进入复合索引。在我添加这些索引之前,我想先了解一下影响会是什么,短期(是否需要几天时间才能添加初始索引?)和长期的(是否会使插入足够慢它是否超过了加速查询的好处?)在包含大量数据的MongoDB数据库上添加索引会产生什么影响?

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

+0

根据数据库大小,数据库结构(副本,碎片)以及服务器的使用情况,创建索引需要一定的时间。你不知道你的数据库大小,所以很难做出回应。一种方法是在你的数据库副本上测试你的复合索引。 – kranteg

+0

编辑添加一些请求的信息。 – betseyb

回答

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

编辑:为了加快速度,您可能需要重新安装noatime标志设置的相应分区。

0

您的数据库中有数百万条推文并不一定是个问题。正如马库斯所说,这可能会导致你的查询停顿,特别是如果你没有被分割。

我经历过的最重要的额外事情(使用数百万记录的10和100)不是记录的数量,而是记录的大小。当我处理超过一百万条记录的价值数据的结核病时,它比一亿多条记录中的100GB数据要慢得多。

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

相关问题