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

efficient collection lookup and index creation in mongodb

我的数据库中有大量数据,每秒多达 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 知道它会阻止调用该函数的线程多长时间吗?

在空collection上创建新索引相当快,您可以通过运行下面的测试

来衡量它
function howLong(){

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

    return t1 - t0;
}

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

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

Background indexing operations run in the background so that other database operations can run while creating the index. However, the mongo shell session or connection where you are creating the index will block until the index build is complete.

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

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

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

由于您的 collection 会增长得相当快并且您将创建一个索引,请确保它适合 RAM see here 因此在插入时 pre-aggregate 数据可能是值得的。

关于检查 collection 是否存在,假设您的应用程序是唯一写入数据库的应用程序,您可以在 start-up 列出所有 collection 并将此信息保存在内存。

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