У меня есть база данных 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? Или я пропустил что-то важное при настройке его производительности?
Но чтобы ответить на ваш актуальный вопрос: невозможно сказать. Ваш индекс может на самом деле помочь или не помочь вашим запросам, поскольку ваш индекс связан только с полем dueDate, но ваш запрос относится к 3 полям, и ваш запрос фактически только проверяет, существует ли dueDate. Это означает, что эффективность вашего индекса зависит от того, как часто ваш dueDate равен нулю. Если он никогда или редко равен нулю, то ваш индекс просто пустая трата времени.
Основываясь исключительно на ваших данных о производительности, я бы предположил, что ваш индекс неэффективен, поскольку сканирование данных для построения индекса занимает примерно столько же времени, сколько и выполнение запроса.
Является ли это «нормальным», ответить гораздо сложнее. Но, вероятно, это нормально, учитывая ваши конкретные обстоятельства, поскольку именно это вы и наблюдаете.
@Flimzy, спасибо за ваш отзыв. Я изменил TABLE_NAME на DATABASE_NAME, чтобы минимизировать путаницу. Я также изменил свой вопрос, чтобы задокументировать, что не вижу разницы во времени обработки, если добавляю «имя владельца» и «рецензент» в качестве дополнительных полей индекса. Проверка на "dueDate" имеет значение null, чтобы разрешить его использование в качестве поля сортировки. Ваш третий комментарий заставляет задуматься. WRT ваш 4-й комментарий, я надеюсь услышать, есть ли у кого-то еще аналогичный показатель производительности, чтобы процитировать.
Добавление ownerName или reviewer в качестве второго и третьего поля вашего индекса не повлияет на ваш текущий запрос. Если вы сделаете эти поля первым и вторым, это может помочь.
Я столкнулся с той же проблемой. Мы ввели несколько экземпляров pouchdb для каждой модели, чтобы повысить производительность.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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