CouchDB - 过滤复制 - 可以提高速度吗?

Col*_*fax 9 replication couchdb

我有一个数据库(300MB和42,924个文档),包含来自约200个用户的大约20种不同类型的文档.这些文档的大小范围从几个字节到很多千字节(150KB左右).

卸载服务器时,以下复制筛选器功能大约需要2.5分钟才能完成.加载服务器时,大约需要10分钟.

任何人都可以评论这些时间是否是预期的,如果没有,建议我如何优化事物以获得更好的性能?

function(doc, req) {
    acceptedDate = true;
    if(doc.date) {
        var docDate = new Date();
        var dateKey = doc.date;
        docDate.setFullYear(dateKey[0], dateKey[1], dateKey[2]);

        var reqYear = req.query.year;
        var reqMonth = req.query.month;
        var reqDay = req.query.day;
        var reqDate = new Date();
        reqDate.setFullYear(reqYear, reqMonth, reqDay);

        acceptedDate = docDate.getTime() >= reqDate.getTime();
    }

    return doc.user_id && doc.user_id == req.query.userid && doc._id.indexOf("_design") != 0 && acceptedDate; 
}
Run Code Online (Sandbox Code Playgroud)

Kxe*_*pal 11

过滤的复制工作很慢,因为每个获取的文档都运行复杂的逻辑来决定是否复制它:

  1. CouchDB获取下一个文档;
  2. 因为必须应用过滤器函数,所以文档转换为JSON;
  3. JSONifyed文件通过stdio传递给查询服务器;
  4. 查询服务器处理文档并从JSON解码它;
  5. 现在,查询服务器查找并运行过滤函数,该函数返回true或false赋值给CouchDB;
  6. 如果结果是true文件被复制;
  7. 转到第1页并循环查看所有文档;

对于非过滤复制,请使用此列表,丢弃p.2-5并始终生成p.6 true.这种开销减慢了整个复制过程.

要显着提高过滤复制速度,您可以通过Erlang本机服务器使用Erlang过滤器.它们在CouchDB中运行,不通过任何stdio接口,并且没有应用JSON解码/编码开销.

注意,Erlang查询服务器不像JavaScript那样在沙箱内运行,因此您需要真正信任您使用它运行的代码.

另一个选择是优化你的过滤器功能,例如减少对象创建,方法调用,但实际上你不会赢得这么多.