问题描述
我试图从 javascript 视图的单个请求中获取大约 900 个键,这需要大约 6-7 秒。索引已完全构建,没有文档被插入到数据库中。当我对 _all_docs
视图执行相同类型的键请求时,它会在不到半秒的时间内返回。我的印象是 _all_docs
视图与任何其他视图一样,我对性能的巨大差异感到困惑。我正在设置 include_docs=true
,我希望索引中的查找类似于 900 * log(n)
,然后是对文档本身进行 900 次提取的开销。是否有我不理解的 CouchDB 架构的某些方面会导致这种差异?
例如,这需要 6-7 秒:
curl --header "Content-Type: application/json" --request "POST" --data '{"keys":[...900 keys...]}' http://couch/database/_design/ddoc/_view/view?include_docs=true&reduce=false&group=false
这几乎是即时的:
curl --header "Content-Type: application/json" --request "POST" --data '{"keys":[...900 keys...]}' http://couch/database/_all_docs?include_docs=true&reduce=false&group=false
编辑
这是我们正在使用的视图。
它发出一个 participantId
和 docType
的数组。
function (doc) {
if (doc.participantId) { emit([doc.participantId,doc.docType]) }
if (doc.participantIds) {
doc.participantIds.forEach(function(participantId) {
emit([participantId,doc.docType])
})
}
}
查询中的键如下所示:
{"keys":[['id1','TYPE1'],['id1','TYPE2'],['id2',etc...]}
编辑 2
这是我在使用 fauxton 时放入控制台的一个片段,它很好地演示了这个问题。它使用一组键查询视图并记录一个计时器,然后使用计时器通过 id 查询相同的文档。我一直看到第一个请求需要 6-7 秒,第二个请求不到一秒。对于相同的确切文件。查看实际的 CouchDB Erland 代码,似乎对 _all_docs 查询的处理方式有所不同,并且可能与可以解释差异的常规 b 树搜索不同。
function test(keys) {
var s = Date.Now()
fetch('/databaose/_design/ddoc/_view/view?include_docs=true&reduce=false&group=false',{
method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({'keys': keys})
}).then(r => r.json()).then(r => {
console.log('Took ' + (Date.Now() - s) + ' ms.')
console.log(r)
return r
}).then(r => {
s = Date.Now()
return fetch('/experience/_all_docs?include_docs=true&reduce=false&group=false',{
method: 'POST',body: JSON.stringify({'keys': r.rows.map(row => row.id)})
}).then(r => r.json()).then(r => {
console.log('Took ' + (Date.Now() - s) + ' ms.')
console.log(r)
})
})
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)