Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在数据库中组织大量时间戳值(sql/nosql)_Sql_Mysql_Nosql - Fatal编程技术网

在数据库中组织大量时间戳值(sql/nosql)

在数据库中组织大量时间戳值(sql/nosql),sql,mysql,nosql,Sql,Mysql,Nosql,我有一个设备,每x毫秒轮询许多不同的字段 该设备返回一个ID和值的列表,我需要将这些ID和值与时间戳一起存储在排序数据库中 系统用户需要能够查询此数据库中的历史日志,以创建图形,或者查询每个值的最后时间戳 一种简单的方法是使用 id,value_id,timestamp,value 并让用户选择 Select value form t where value_id=x order by timestamp desc limit 1 只需使用时间戳和id上的索引将所有内容推到那里,但我的问题是

我有一个设备,每x毫秒轮询许多不同的字段 该设备返回一个ID和值的列表,我需要将这些ID和值与时间戳一起存储在排序数据库中

系统用户需要能够查询此数据库中的历史日志,以创建图形,或者查询每个值的最后时间戳

一种简单的方法是使用

id,value_id,timestamp,value
并让用户选择

Select value form t where value_id=x order by timestamp desc limit 1
只需使用时间戳和id上的索引将所有内容推到那里,但我的问题是,设计模式的最佳性能/大小方法是什么?还是使用nosql?有人能评论一下可能的设计权衡吗。这样的设计会有数百万条记录吗?

当你说“…或查询每个值的最后一个时间戳”时,这就是你的想法吗

    select max(timestamp) from T where value = ?
如果您有数百万条记录,并且上面的内容就是您的意思(即WHERE子句中只有value),那么您需要在value列上创建一个索引,否则您必须执行完整的表扫描。但是,如果查询在WHERE子句中总是有[timestamp]列,那么如果在timestamp上有索引,则不需要在[value]列上建立索引

如果用户将在where子句中单独显示timestamp列时发出查询,则需要timestamp列上的索引:

  select * from T where timestamp > x and timestamp < y
你可以选择

  • 索引(复合;覆盖值、时间戳和值,或它们的组合):您应该使用不同的索引测试性能;复合和非复合,也要注意有很多不同的方法来获得“每个组的最大值”(搜索so,特别是带有变量的mysql版本)

  • 触发器-您可以使用触发器在另一个表中保持最大行值(进一步选择的最佳性能;这是冗余的,可以保存在内存中)

  • 惰性统计信息/触发器,因为数据库经常更新,如果定期更新统计信息,则可以节省周期(如果允许统计信息保留y秒,并且如果每秒轮询1000/x次,则可能会保存y*100/x的潜在更新;这一点很明显,尤其是在可伸缩性方面)


如果您想了解最后一点性能,如果不简单的话,以上是正确的。

我正在选择id,需要将值取出来,补充了我对选择将如何工作的想法。大约有250个不同的id。您需要为每个零件维护被替代值的历史记录吗?还是你真的只对最近的价值感兴趣?我已经更新了我的答案,向大家展示了如何做到这两个方面,非常有效。我需要这两个方面,谢谢你的回答!“搜索so,特别是带有变量的mysql版本”是什么意思?搜索so意味着搜索堆栈溢出:获取一行中有一些聚合值(最小值、最大值等)是SQL标记最常见的问题之一。在SQL中有几种(本质上不同的)方法可以实现这一点。
Update latest
set value = x
where id = ?