在mongodb中进行高效的集合查找和索引创建

时间:2015-01-22 21:25:01

标签: python mongodb pymongo

我的数据库中有大量数据,每秒最多1,000个文档。当我收到每一个时,我试图根据文档中的字段有效地检查是否已存在该类型文档的集合,然后如果不是,我想在该集合上创建一些索引。基本上我想知道在空集合上创建索引需要多长时间,以及是否有更快的方法来检查是否存在具有指定名称的集合。

def insert_new_doc(json_doc):
  collection_name = json_doc["collection_name"]
  coll = tlm_db_connection[collection_name]

  # create indexes in background if the collection doesn't exist
  if tlm_db_connection.system.namespaces.find( { name : collection_name } ) == None:
      coll.ensure_index([('time_stamp', pymongo.DESCENDING)], background = True)
      coll.ensure_index([('raw_value', pymongo.DESCENDING)], background = True)
      coll.ensure_index([('time_stamp', pymongo.DESCENDING), ('raw_value', pymongo.DESCENDING)], background = True)

  coll.insert(json_doc)

这就是我的功能。如果我将ensure_index设置为background = True,任何想法阻止调用该函数的线程有多长时间?

1 个答案:

答案 0 :(得分:2)

在空集合上创建新索引非常快,您可以通过运行以下测试来测量它

function howLong(){

    var t0 = new Date().valueOf();
    db.myCollection.ensureIndex({name: 1});
    var t1 = new Date().valueOf();

    return t1 - t0;
}

EnsureIndex将阻止,直到创建索引。在我的旧笔记本电脑上说0:)

可以使用相同的技术来获得约"背景" mongoshell中索引的创建时间。

  

后台索引操作在后台运行,以便其他   数据库操作可以在创建索引时运行。然而    mongo shell会话或连接您要在其中创建索引   将阻止,直到索引构建完成。

http://docs.mongodb.org/manual/core/index-creation/#behavior

如果你足够早地调用ensureIndex它会很快,即在我的机器上索引10万个项目(按用户名称索引)大约需要350毫秒。

对ensureIndex的后续调用(在创建之后)将立即退出(使用适当的消息),但如果可以,我不会这样做。 (即数据库由我控制而不与他人共享)我会为索引创建做专门的线程。

由于您的收藏速度会非常快,您将创建一个索引,请确保它适合RAM see here,因此在插入时预先聚合数据可能是值得的。

关于检查集合是否存在,假设您的应用程序是唯一写入数据库的应用程序,您可以在启动时列出所有集合并将此信息保存在内存中。

10gen-Labs有一个有趣的项目似乎解决了类似的问题(虽然是java代码)可能值得看看High Volume Data Feed