我有几个CouchDB数据库。最大的是大约60万个文档,我发现查询非常长(几个小时或更长)。数据库很少更新(每月一次左右),只涉及添加新文档,从不更新现有文档。
查询的类型是:查找所有key1='a'或多键:key1='a', key2='b'.
我看不出永久视图在这里是实用的,所以一直在使用CouchDB 'query‘方法。
我已经尝试过几种方法,我不知道什么是最有效的,或者是为什么。
方法1:地图功能是:
map_fun = '''function(doc){
if(doc.key1=='a'){
emit(doc.A, [doc.B, doc.C,doc.D,doc.E]);
}
}'''Python的查询是:结果= ui.db.query(map_fun,key2=user)
然后用进行results.rows操作。这占用了最多的时间。
“results.rows”回来大约需要一个小时。如果我将key2改为其他东西,它将在大约5秒后返回。如果我重复原来的用户,它也是快速的。
但有时我需要查询更多的键,所以我尝试:
map_fun = '''function(doc){
if(doc.key1=='a' && doc.key2=user && doc.key3='something else' && etc.){
emit(doc.A, [doc.B, doc.C,doc.D,doc.E]);
}
}'''并使用python查询:
结果= ui.db.query(map_fun),然后使用results.rows进行手术
第一个查询需要很长时间。当我改变key2时,又要花很长时间。如果我将key2更改为原始数据,则所需时间相同。(也就是说,似乎没有任何东西被缓存,B树或其他什么的)。
因此,我的问题是:在couchdb中执行查询的最有效方法是什么,其中查询是临时的,涉及多个搜索条件键?
UI是基于QT的,下面使用PyQt。
发布于 2012-08-22 20:22:58
couchdb db.query()方法有两个注意事项:
发布于 2012-08-24 08:25:10
我认为解决问题的方法是为正在搜索的键创建一个索引。这就是你所说的永久观点。
请注意基于B树的表中映射/减少查询和SQL查询之间的差异:
您所做的是针对每个查询。
我认为你的解决方案必须慢下来。
如果重新设计数据库结构,使永久视图切实可行,(1.)只执行一次(2.)将对每个查询执行。添加到DB后,每个文档将由视图读取,查询将在B树中搜索,存储发出的结果。如果发出的集小于文档总数,则查询将搜索较小的结构,并且您将受益于SQL数据库。
临时视图的效率要低得多,而不是永久性的视图,只能用于发展。CouchDB被设计为与永久视图一起工作。要使map/还原高效,必须实现缓存或使视图永久化。我不熟悉CouchDB实现的细节,也许使用不同键的第二个查询更快,因为有些缓存。如果出于某种原因,您必须使用临时视图,那么CouchDB可能是一个错误,您应该考虑为MongoDB这样的在线查询创建和优化DBMS。
https://stackoverflow.com/questions/12080358
复制相似问题