我的数据库中有大量数据,每秒最多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,任何想法阻止调用该函数的线程有多长时间?
答案 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