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