我正在使用 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'
})
问题是,我提出这个问题是因为我不知道这是正常的还是我做错了什么。我希望你能帮助我。
首先使用“选择器”语法与 JavaScript 函数:选择器在过滤 CouchDB 更改提要时要快得多。简而言之,所有工作都可以在 Erlang 内部完成,无需启动任何 JavaScript 进程来决定是否应该进行更改。
应该清楚的是,数据库越大,这个用例就会变得越慢。如果您正在“同步”大型数据库的一个非常小的子集,那么 CouchDB 将不得不假脱机处理整个更改提要(数据库的历史记录)以找到您需要的少量文档。这适用于非常小的数据库,但对于 20k 文档来说速度很慢,而且速度越来越慢。如果您打算继续增长数据库,那么此解决方案将无法很好地扩展。想象一个拥有 5 亿文档的数据库?!
我通过选择一种不同的技术在新的空 PouchDB 数据库中播种数据来为客户解决了这个问题:首先使用查询填充数据,然后复制以赶上任何最近的更改。对于更大的数据库,这 much 更快。它写在这里:https://blog.cloudant.com/2019/06/21/Replicating-from-a-Query.html.
简而言之:
_bulk_get
端点获取所需文档的文档主体,该端点返回每个文档的复制历史记录。^ 这为您提供了与复制相同的数据,但速度更快。
然后您可以从远程数据库复制,但提供“since=now”参数以获取最新更改,或“since=”。