查询大型 PouchDB 数据集的最高性能范围方式
Most performant way of range querying large PouchDB datasets
我正在构建一个物联网应用程序,它每秒收集一堆不同的指标。在客户端上,我使用图表显示数据。
但是,每次我更改图表的时间范围/重新加载页面时,从服务器加载所有数据点都需要很长时间。所以我开始研究浏览器中的持久存储,主要使用 PouchDB。然后每次浏览器刷新时,数据获取都会更加快速。当然,您必须考虑浏览器配额等,但这是一个不同的问题。
示例数据点如下所示
{
"metricId": <String>,
"metricName": <String>,
"timestamp": <Unix Timestamp>
"value": <Integer>
}
方法 1 - 多个数据库,一个索引
由于我有许多不同的指标,我正在考虑为每个指标创建一个新的 PouchDB 数据库,然后根据时间戳编制索引。
// (using pouchdb-find plugin)
const db = new PouchDB(<metricName>);
db.createIndex({ index: { fields: ['timestamp'] } })
db.find({
selector: { timestamp: { '$gte' : from, '$lte' : to }}
})
方法 2 - 一个数据库,多个索引
另一种解决方案是创建一个数据库来保存所有指标,并改为使用多个索引。
// (using pouchdb-find plugin)
const db = new PouchDB('all_data');
db.createIndex({
index: { fields: ['metricId', 'metricName', 'timestamp'] }
});
db.find({
selector: {
$and: [
{ metricId: metricId },
{ metricName: metricName },
{ timestamp: { '$gte' : from, '$lte' : to }}
]
}
})
问题
两者中哪个性能最高,或者是否有更智能的索引创建方法?还是有没有一种不同的方法根本不使用 PouchDB?
当我找到解决方案时,我提出了自己的问题,不是使用 PouchDB,而是使用 YDN-DB。使用上面的方法1与多个数据库和一个索引列(整数时间戳类型),我已经达到了非常好的性能。
写入和读取 ~5000 行大约需要 300 毫秒。我的测试表明,这种方法比使用复合索引快 3 倍(方法 2)。
如果其他人偶然发现这个 SO 问题,请在此处发布代码。
// Create unique DB with index
const dbname = [metricId, metricName].join("_");
const schema = {
stores: [{
name: 'metrics',
indexes: [{ keyPath: 'timestamp' }]
}]
}
const db = new ydn.db.Storage(dbname, schema);
// writing data.. timestamp is unix timestamp
db.put('metrics', { timestamp, value }, timestamp);
// reading data
const query = db.from('metrics').where('timestamp', '>=', from, '<=', to);
query.list(5000).done(result => {
console.log(result);
});
相关文章:
- 正在全局范围中查找JavaScript函数
- 如何通过数组更新角度子范围
- 如何使用ngrepeat和双向绑定获得指令的隔离范围
- HTML范围:动态设置值属性
- "实例范围”;TypeScript类的getter/setter
- jquery日期选择器年份范围默认值
- Jpgraph:如何手动设置X轴和Y轴的范围
- 在对象数组中查找多个值的d3范围
- 动态加载angularjs并生成控制器和范围
- 如何通过谷歌应用程序脚本从谷歌文档中的位置确定命名范围
- 在Materialize Calendar中设置年份范围
- 在MVVM视图模型中处理应用程序范围的元素
- setInterval游戏循环的范围问题
- AngularJS获取范围中的选定项目
- 从指定范围创建字符数组
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- Angularjs无法将单选按钮与嵌套范围内的模型绑定
- ngDialog-弹出窗口未更新范围变量
- 如何使用D3生成特定范围内的随机颜色
- 如何将输入范围的值传递给JS中的变量