在Pouchdb /Couchdb中,通过过滤器或视图的复制是否应该比直接在复制中使用“选择器”更快?

ijxebb2r  于 2023-05-11  发布在  CouchDB
关注(0)|答案(1)|浏览(146)

我正在使用PouchDb和CouchDb进行一些测试,以便尽可能优化我的Ionic应用程序。在有几百个文档的数据库中,我没有问题,但是在更大的数据库中(从20,000开始),复制需要一段时间。
目前,我们复制的方式是使用selector参数:

this.remoteDb.replicate.to(this.localDb, {
    selector: {
        "tipo": "Parte",
        "estado": 0
    }
})

事情是这样的,我开始做一些测试,认为如果我使用在服务器上创建的过滤器或视图,实现会更快,因为这些过滤器和视图会生成一系列索引,这些索引应该会加快获取文档的过程。但是,在仅复制类型为“Parte”且状态为0的文档时,我发现以下情况:
数据库包含31,090个文件。

使用选择器:

this.remoteDb.replicate.to(this.localDb, {
    selector: {
        "tipo": "Parte",
        "estado": 0
    }
})

返回4个文档耗时4910 ms

使用服务端定义的过滤器:

  • 服务器过滤器:*
function(doc,req){
    return doc && doc.tipo===req.query.tipo && doc.estado === parseInt(req.query.estado)
}
  • 客户代码:*
this.remoteDb.replicate.to(this.localDb, {
    filter: 'datos/tipo',
    query_params:{
        "tipo": "Parte",
        "estado": 0
    }
})

使用服务端定义的视图:

  • 服务器视图:*
function (doc) {
    if(doc && doc.tipo && doc.tipo==='Parte' && doc.estado === 0)
        emit(doc.tipo, 1);
}
  • 客户代码:*
this.remoteDb.replicate.to(this.localDb, {
    filter: '_view',
    view: 'pruebas/parte'
})

问题是,我提出这个问题是因为我不知道这是正常的还是我做错了什么。我希望你能帮助我。

olqngx59

olqngx591#

首先,使用“选择器”语法与JavaScript函数:选择器在过滤CouchDB更改提要时要快得多。简而言之,所有的工作都可以在Erlang内部完成,而不需要启动任何JavaScript进程来决定是否应该进行更改。
应该清楚的是,数据库越大,这个用例就会变得越慢。如果您正在“同步”一个大型数据库的一个非常小的子集,那么CouchDB必须遍历整个更改提要(数据库的历史)来找到您需要的少量文档。这对于非常小的数据库来说是可以找到的,但是对于20 k的文档来说会比较慢,并且会逐渐变慢。如果您打算继续增长数据库,那么这个解决方案将无法很好地扩展。想象一下一个拥有5亿文档的数据库?!
我为一个客户解决了这个问题,选择了一种不同的技术在一个新的空PouchDB数据库中播种数据:首先用查询填充数据,然后复制以赶上任何最近的更改。这在更大的数据库中要快得多。上面写着:https://blog.cloudant.com/2019/06/21/Replicating-from-a-Query.html

相关问题