我有几个 CouchDB 数据库。最大的是大约 600k 个文档,我发现查询时间过长(几个小时或更长时间)。数据库不经常更新(大约一个月一次),只涉及添加新文档,从不更新现有文档。
查询的类型:查找所有文档,其中key1='a'
或多个键: key1='a', key2='b'
...
我认为永久视图在这里并不实用,因此一直在使用 CouchDB-Python 的“查询”方法。
我尝试了几种方法,但我不确定哪种方法最有效,或者为什么。
方法一:map函数为:
map_fun = '''function(doc){
if(doc.key1=='a'){
emit(doc.A, [doc.B, doc.C,doc.D,doc.E]);
}
}'''
Python 查询是: results = 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 查询:
results = ui.db.query(map_fun) 然后对 results.rows 进行一些操作
第一次查询需要很长时间。当我更改 key2 时,又需要很长时间。如果我将 key2 更改回原始数据,则需要相同的时间。(也就是说,似乎没有任何东西被缓存,B-tree'ed 或其他)。
所以我的问题是:在 couchdb-python 中进行查询的最有效方法是什么,其中查询是临时的并且涉及搜索条件的多个键?
UI 是基于 QT 的,在下面使用 PyQt。