我正在构建一个IoT应用程序,它每秒收集一堆不同的指标。在客户端,我使用图表显示数据。
但是,每次我更改图表的时间范围/重新加载页面时,从服务器加载所有数据点都需要花费太长时间。所以我开始在浏览器中寻找持久存储,主要是使用PouchDB。然后每次浏览器刷新时,数据获取都会更加快捷。当然,您必须考虑浏览器配额等,但这是一个不同的问题。
示例数据点看起来像这样
{
"metricId": <String>,
"metricName": <String>,
"timestamp": <Unix Timestamp>
"value": <Integer>
}
由于我有许多不同的指标,我考虑创建一个新的PouchDB数据库每个指标,然后在时间戳上编制索引。
// (using pouchdb-find plugin)
const db = new PouchDB(<metricName>);
db.createIndex({ index: { fields: ['timestamp'] } })
db.find({
selector: { timestamp: { '$gte' : from, '$lte' : to }}
})
另一个解决方案是创建一个数据库来保存所有指标,并改为使用多个索引。
// (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的情况下有不同的方法吗?
答案 0 :(得分:1)
在找到解决方案时解决了我自己的问题,不是使用PouchDB而是使用YDN-DB。使用上面的方法1 与多个数据库和一个索引列(整数时间戳类型),我已经达到了非常好的性能。
写入和读取〜5000行大约需要300毫秒。我的测试表明,这种方法比使用复合指数快了约3倍(方法2 )。
如果其他人偶然发现了这个问题,请在此处发布代码。
// 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);
});