微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

视图上的 CouchDB 键查询比 _all_docs 上的键查询慢得多

如何解决视图上的 CouchDB 键查询比 _all_docs 上的键查询慢得多

我试图从 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

编辑

这是我们正在使用的视图。 它发出一个 participantIddocType 的数组。

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 举报,一经查实,本站将立刻删除。