首页 > 解决方案 > 视图上的 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)
        })
    })
}

标签: couchdb

解决方案


推荐阅读