что быстрее: views или allDocs с Array.filter? - PullRequest
0 голосов
/ 11 сентября 2018

Мне было интересно узнать о различиях в производительности между выделенными представлениями в CouchDb / PouchDb VS, просто извлекая allDocs, а затем фильтруя их с помощью Array.prototype.filter.

Допустим, мы хотим получить 5000 документов todo, хранящихся вбаза данных.

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

Что лучше?Каковы плюсы и минусы каждого из 2 методов?

1 Ответ

0 голосов
/ 13 сентября 2018

Использование вида будет лучше масштабироваться.Но то, что «быстрее», будет зависеть от многих факторов, которые вам необходимо будет сравнить в вашем конкретном случае с вашим оборудованием, сетью и данными.

В случае «all_docs» вы фактически будете передавать всюбазы данных для клиента, поэтому скорость сети будет существенным фактором при росте базы данных.Если вы сделаете это так, как вы сделали, поместив все документы в массив и затем отфильтровав, вы в какой-то момент достигнете пределов использования памяти - вам действительно нужно обработать результаты в виде потока.Этот подход - O (N), где N - количество документов в базе данных.

В случае «просмотра» индекс B-Tree используется для поиска диапазона подходящих документов.Клиенту отправляются только совпадающие документы, поэтому экономия времени и памяти в сети зависит от доли совпадающих документов во всех документах.Сложность по времени составляет O (log (N) + M), где N - общее количество документов, а M - количество совпадающих документов.

Если N большое, а M маленькое, такой подход следует отдать предпочтение.Поскольку M приближается к N, оба подхода в значительной степени совпадают.Если M и N неизвестны или сильно изменяются, используйте представление.

Вы должны рассмотреть еще одну вещь - вам нужен весь документ возвращен?Если вам нужны только несколько полей из больших документов, тогда представления могут возвращать только эти поля, что дополнительно сокращает использование сети и памяти.

Запросы манго также могут представлять интерес вместо представлений для этого вида запросов.Вы можете создать индекс над полем «тип», если размер набора данных требует этого, но это не обязательно.

Лично я бы использовал запрос Манго и добавил бы индекс, если / когда это необходимо.

...