couchdb - 视图上的 CouchDB 键查询比 _all_docs 上的键查询慢得多
问题描述
我试图在一个请求中从一个大约需要 6-7 秒的 javascript 视图中获取大约 900 个密钥。索引已完全构建,并且没有文档被插入到数据库中。当我对_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
它发出一个 a和的数组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', 'TYPE1'], etc...]}
编辑 2
这是我在使用 fauxton 时放入控制台的一个片段,它很好地展示了这个问题。它使用一组键查询视图并记录一个计时器,然后使用计时器通过 id 查询相同的文档。我一直看到第一个请求需要 6-7 秒,而第二个请求不到一秒。对于相同的确切文件。查看实际的 CouchDB Erland 代码,似乎 _all_docs 查询的处理方式有所不同,并且可能与可以解释差异的常规 b-tree 搜索不同。
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',
headers: {'Content-Type': 'application/json'},
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)
})
})
}
解决方案
推荐阅读
- java - POJO 的 ArrayList 未保存在所有设备共享首选项上
- python-3.x - 将 pyspark 数据帧写入雪花表时出错 [snowflake-cloud-data-platform]
- flutter - 如何删除 SliverAppBar 中的空白空间?
- python - 如何返回命令行
- java - 没有实体的 JPA 一对多
- python - 我在 python 中的列表由于某种原因被 [' '] 覆盖
- android - Xamarin Webview - Android 上的相机
- java - System.getProperty("user.dir") 路径(如果应用程序以 root 身份运行)
- c - 我得到了对“合并”的未定义引用,即使我告诉了我的 makefile 我能想到的一切
- python - 如何使用 train_test_split?修复错误 n_samples = 0