Это ожидаемая производительность PouchDb?

У меня есть база данных PouchDb, содержащая около 32 000 документов. Я использую pouchdb-find и запускаю следующий код для получения показателя производительности:

const execute = async () => {
  const DATABASE_NAME = 'database';

  console.info('INITIAL          TIMESTAMP 00 : ' + getComparableUtcDate() + ' : ' + DATABASE_NAME);

      const PouchDB = require('pouchdb');
      const pouchDatabase = new PouchDB(DATABASE_NAME, {
        revs_limit: 0,
        auto_compaction: true,
      });

  console.info('CREATED DATABASE TIMESTAMP 01 : ' + getComparableUtcDate() + ' : ' + DATABASE_NAME);

      PouchDB.plugin(require('pouchdb-find'));
      await deleteAllIndices(pouchDatabase);

  console.info('DELETED INDICES  TIMESTAMP 02 : ' + getComparableUtcDate() + ' : ' + DATABASE_NAME);

      let indexDdoc = 'index-design-doc_' + 'TEST';
      await pouchDatabase.createIndex({
        index: {
          fields: ['dueDate'],
          ddoc: indexDdoc,
        },
      });

  console.info('CREATED INDEX    TIMESTAMP 03 : ' + getComparableUtcDate() + ' : ' + DATABASE_NAME);

      let query = {
        selector: {
          dueDate: { $gte: null },
          ownerName: { $eq: 'Garlette, Wilma' },
          reviewer: { $eq: 'Elaine Reviewer'}
        },
        sort: [
          { dueDate: 'desc' }
        ],
        use_index: indexDdoc,
      };

  console.info('CREATED QUERY    TIMESTAMP 04 : ' + getComparableUtcDate() + ' : ' + DATABASE_NAME);

      let results = await pouchDatabase.find(query);

  console.info('FIND             TIMESTAMP 05 : ' + getComparableUtcDate() + ' : ' + DATABASE_NAME);

      indexDdoc = 'index-design-doc_' + 'TEST';
      await pouchDatabase.createIndex({
        index: {
          fields: ['dueDate'],
          ddoc: indexDdoc,
        },
      });

  console.info('CREATED INDEX    TIMESTAMP 06 : ' + getComparableUtcDate() + ' : ' + DATABASE_NAME);

      query = {
        selector: {
          dueDate: { $gte: null },
          ownerName: { $eq: 'Garlette, Wilma' },
          reviewer: { $eq: 'Elaine Reviewer' }
        },
        sort: [
          { dueDate: 'desc' }
        ],
        use_index: indexDdoc,
      };

  console.info('CREATED QUERY    TIMESTAMP 07 : ' + getComparableUtcDate() + ' : ' + DATABASE_NAME);

      results = await pouchDatabase.find(query);

  console.info('FIND             TIMESTAMP 08 : ' + getComparableUtcDate() + ' : ' + DATABASE_NAME);
};

execute();

async function deleteAllIndices(localTable) {
  let indices = await localTable.getIndexes();
  for (let index of indices.indexes) {
    if (index.ddoc !== null) {
      await localTable.deleteIndex(index);
    };
  };
}

function getComparableUtcDate(localDateObject = null, offsetInDays = 0) {
  let localDate;
  if (localDateObject === null) {
    localDate = new Date();
  } else {
    localDate = localDateObject;
  }

  if (offsetInDays !== 0) {
    localDate.setDate(localDate.getDate() + offsetInDays);
  }

  const utcDate = localDate.toUTCString(); // "Wed, 14 Jun 2017 07:00:00 GMT"

  const parts = utcDate.split(' ');
  const year = parts[3];
  const month = getMonthNumber(parts[2]);
  const day = parts[1].padStart(2, '0');

  const subParts = parts[4].split(':');
  const hour = subParts[0].padStart(2, '0');
  const minute = subParts[1].padStart(2, '0');
  const second = subParts[2].padStart(2, '0');

  const utcMilliseconds = localDate.getUTCMilliseconds().toString();
  const millisecond = utcMilliseconds.padStart(3, '0');

  const timezone = 'UTC';

  const comparableUtcDate = year + month + day
    + '_' + hour + minute + second + '.' + millisecond
    + '_' + timezone;

  return comparableUtcDate;
};

function getMonthNumber(monthName) {
  const truncMonthName = monthName.substring(0, 3).toUpperCase();

  let monthNumber;
  switch (truncMonthName) {
    case 'JAN':
      monthNumber = '01';
      break;
    case 'FEB':
      monthNumber = '02';
      break;
    case 'MAR':
      monthNumber = '03';
      break;
    case 'APR':
      monthNumber = '04';
      break;
    case 'MAY':
      monthNumber = '05';
      break;
    case 'JUN':
      monthNumber = '06';
      break;
    case 'JUL':
      monthNumber = '07';
      break;
    case 'AUG':
      monthNumber = '08';
      break;
    case 'SEP':
      monthNumber = '09';
      break;
    case 'OCT':
      monthNumber = '10';
      break;
    case 'NOV':
      monthNumber = '11';
      break;
    case 'DEC':
      monthNumber = '12';
      break;
    default:
      monthNumber = 'xx';
  }

  return monthNumber;
};

Я получаю следующий вывод:

INITIAL          TIMESTAMP 00 : 20190314_005045.585_UTC : database
CREATED DATABASE TIMESTAMP 01 : 20190314_005045.687_UTC : database
DELETED INDICES  TIMESTAMP 02 : 20190314_005045.807_UTC : database
CREATED INDEX    TIMESTAMP 03 : 20190314_005050.466_UTC : database
CREATED QUERY    TIMESTAMP 04 : 20190314_005050.466_UTC : database
FIND             TIMESTAMP 05 : 20190314_005055.343_UTC : database
CREATED INDEX    TIMESTAMP 06 : 20190314_005055.392_UTC : database
CREATED QUERY    TIMESTAMP 07 : 20190314_005055.392_UTC : database
FIND             TIMESTAMP 08 : 20190314_005059.953_UTC : database

что показывает, что для первоначального создания индекса требуется около 4,6 секунд, а затем около 4,9 секунд для выполнения find(). Как и ожидалось, вторая попытка создания индекса происходит почти мгновенно, поскольку он уже существует, а второй поиск занимает примерно столько же времени, сколько и первый. Я не обнаружил разницы во времени обработки, если добавил «имя владельца» и «рецензент» в качестве дополнительных полей индекса.

Мой вопрос: нормально ли это время для базы данных PouchDb, использующей pouchdb-find? Или я пропустил что-то важное при настройке его производительности?

Использование «имени таблицы» в PouchDB сбивает с толку, поскольку в PouchDB нет таблиц.

Flimzy 14.03.2019 09:56

Но чтобы ответить на ваш актуальный вопрос: невозможно сказать. Ваш индекс может на самом деле помочь или не помочь вашим запросам, поскольку ваш индекс связан только с полем dueDate, но ваш запрос относится к 3 полям, и ваш запрос фактически только проверяет, существует ли dueDate. Это означает, что эффективность вашего индекса зависит от того, как часто ваш dueDate равен нулю. Если он никогда или редко равен нулю, то ваш индекс просто пустая трата времени.

Flimzy 14.03.2019 09:58

Основываясь исключительно на ваших данных о производительности, я бы предположил, что ваш индекс неэффективен, поскольку сканирование данных для построения индекса занимает примерно столько же времени, сколько и выполнение запроса.

Flimzy 14.03.2019 09:59

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

Flimzy 14.03.2019 09:59

@Flimzy, спасибо за ваш отзыв. Я изменил TABLE_NAME на DATABASE_NAME, чтобы минимизировать путаницу. Я также изменил свой вопрос, чтобы задокументировать, что не вижу разницы во времени обработки, если добавляю «имя владельца» и «рецензент» в качестве дополнительных полей индекса. Проверка на "dueDate" имеет значение null, чтобы разрешить его использование в качестве поля сортировки. Ваш третий комментарий заставляет задуматься. WRT ваш 4-й комментарий, я надеюсь услышать, есть ли у кого-то еще аналогичный показатель производительности, чтобы процитировать.

M. Hays 14.03.2019 16:54

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

Flimzy 14.03.2019 16:58

Я столкнулся с той же проблемой. Мы ввели несколько экземпляров pouchdb для каждой модели, чтобы повысить производительность.

Sudhir 13.12.2021 05:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
7
313
0

Другие вопросы по теме