Couchdb 使用Array.filter的视图或所有文档哪个更快?

Couchdb 使用Array.filter的视图或所有文档哪个更快?,couchdb,pouchdb,Couchdb,Pouchdb,我想知道CouchDb/PockDB中的专用视图与简单地检索所有文档以及稍后使用Array.prototype.filter对它们进行过滤之间的性能差异 假设我们希望在数据库中存储5000个待办事项文档 // Method 1: get all tasks with a dedicated view "todos" // in CouchDB function (doc) { if (doc.type == "todo"){ emit(doc._id); } } //

我想知道CouchDb/PockDB中的专用视图与简单地检索所有文档以及稍后使用Array.prototype.filter对它们进行过滤之间的性能差异

假设我们希望在数据库中存储5000个待办事项文档

// Method 1: get all tasks with a dedicated view "todos"

// in CouchDB
function (doc) { 
  if (doc.type == "todo"){
      emit(doc._id);
  }
}

// on Frontend
var tasks = (await db.query('myDesignDoc/todos', {include_docs: true})).rows;


// Method 2: get allDocs, and then filter via Array.filter

var tasks = (await db.allDocs({include_docs: true})).rows;
tasks = tasks.filter(task => {return task.doc.type == 'todo'});

什么更好?这两种方法的优缺点是什么

使用视图可以更好地缩放。但哪一个“更快”将取决于许多因素,您需要在硬件、网络和数据上针对特定情况进行基准测试

对于“all_docs”的情况,您将有效地将整个数据库传输到客户端,因此随着数据库的增长,网络速度将是一个很大的因素。如果按现有方式执行此操作,将所有文档放在一个数组中,然后进行过滤,您将在某个时候达到内存使用限制-您确实需要将结果作为流进行处理。这种方法是O(N),其中N是数据库中的文档数

对于“视图”情况,使用B树索引查找匹配文档的范围。只有匹配的文档才会发送到客户端,因此网络时间和内存的节省取决于所有文档中匹配文档的比例。时间复杂度为O(log(N)+M),其中N是文档总数,M是匹配文档数

如果N较大,M较小,则应采用这种方法。当M接近N时,两种方法几乎相同。如果M和N未知或高度可变,请使用视图

你应该考虑另一件事——你需要全部文件归还吗?如果您只需要大型文档中的几个字段,那么视图可以只返回这些字段,从而进一步减少网络和内存的使用

对于这类查询,芒果查询可能会引起兴趣,而不是视图。如果数据集大小允许,您可以在“type”字段上创建索引,但这不是强制性的


就我个人而言,我会使用Mango查询,并在必要时添加索引。

对这两个查询进行基准测试时会发生什么?哪个对你来说更快?哪个更快取决于很多事情。最重要的是:CouchDB服务器相对于浏览器的速度,以及网络连接的速度。但一般来说,最有效的方法是使用服务器端过滤器,原因显而易见。