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

问题描述 投票:0回答:1

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

目前我们复制的方式是使用选择器参数:

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 毫秒

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

服务器过滤器:

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'
})

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

couchdb pouchdb ionic5
1个回答
0
投票

首先使用“选择器”语法与 JavaScript 函数:选择器在过滤 CouchDB 更改提要时要快得多。简而言之,所有工作都可以在 Erlang 内部完成,无需启动任何 JavaScript 进程来决定是否应该进行更改。

应该清楚的是,数据库越大,这个用例就会变得越慢。如果您正在“同步”大型数据库的一个非常小的子集,那么 CouchDB 将不得不假脱机处理整个更改提要(数据库的历史记录)以找到您需要的少量文档。这适用于非常小的数据库,但对于 20k 文档来说速度很慢,而且速度越来越慢。如果您打算继续增长数据库,那么此解决方案将无法很好地扩展。想象一个拥有 5 亿文档的数据库?!

我通过选择一种不同的技术在新的空 PouchDB 数据库中播种数据来为客户解决了这个问题:首先使用查询填充数据,然后复制以赶上任何最近的更改。对于更大的数据库,这 much 更快。它写在这里:https://blog.cloudant.com/2019/06/21/Replicating-from-a-Query.html.

简而言之:

  • 查询远程数据库以获取您需要的数据子集。此查询应由二级索引支持,以便快速且可扩展。
  • 使用 CouchDB 的
    _bulk_get
    端点获取所需文档的文档主体,该端点返回每个文档的复制历史记录。
  • 将这些文件写入PouchDB

^ 这为您提供了与复制相同的数据,但速度更快。

然后您可以从远程数据库复制,但提供“since=now”参数以获取最新更改,或“since=”。

© www.soinside.com 2019 - 2024. All rights reserved.