MySQL阵列选择&;基于索引位置更新语句 请考虑下表的图像,我的问题涉及执行更新> />代码> > > SysRoalValue< /代码>栏。< /P>
MySQL阵列选择&;基于索引位置更新语句 请考虑下表的图像,我的问题涉及执行更新> />代码> > > SysRoalValue< /代码>栏。< /P>,mysql,json,mariadb,Mysql,Json,Mariadb,sensor_values列是一个长度为86400的数组,对应于一天中每秒的传感器值。现在我将其设置为JSON数据类型 我的问题 如何对特定索引执行更新 i、 e.将一天中的第5秒或索引[4]更改为300.25 如何选择一天中的前300秒?下面是伪代码 从事实中选择传感器值[0:299],其中d_日期='2020-03-10'和dim_标签='Water_Temp' 这里有一个链接,指向PostGresql的DBFiddle,它做的事情与我在MariaDB中尝试完成的事情非常相似。 编辑
sensor_values
列是一个长度为86400的数组,对应于一天中每秒的传感器值。现在我将其设置为JSON
数据类型
我的问题
如何对特定索引执行更新
- i、 e.将一天中的第5秒或索引
更改为[4]
300.25
从事实中选择传感器值[0:299],其中d_日期='2020-03-10'和dim_标签='Water_Temp'
这里有一个链接,指向PostGresql的DBFiddle,它做的事情与我在MariaDB中尝试完成的事情非常相似。
编辑:下面是我的系统的高级概述
我有一个Python数据管道,它读取数千个传感器的值并执行计算。它负责存储在其他表中的所有数据求和
我需要第二级的数据,以便能够方便地进行分析,我正试图以本问题中提到的方式进行分析。我的想法是使用Python获取当天的第二个,并将其用作要更新的数组索引,如下所示:
now=datetime.datetime.now()
午夜=现在。替换(小时=0,分钟=0,秒=0,微秒=0)
secondsSinceMidnight=(现在为午夜)。秒
传感器值=300.25
sensorTag=“水温”
sqlQuery=
"""
更新事实
设置传感器值[%s]=%s
其中d_日期=%s和尺寸标签=%s
"""
sqlValues=secondsSinceMidnight,sensorValue,datetime.datetime.today().strftime(“%Y-%m-%d”),sensorTag
update(sqlQuery,sqlValues)
我不想整天都用Python跟踪值,然后执行插入操作,因为如果程序崩溃,我会丢失所有数据,使用预先形成的数组可以通过编程快速确定程序其他区域中数据缺失的位置(即,sensor_value
是一天中一组秒的0
)
我使用术语“预成型阵列”,因为我计划让我的程序定期检查,以确保当前和第二天每个传感器始终有一行可用,确保在午夜无缝过渡,因为颗粒非常小
正如Bill Karwin在回答中所建议的那样,这是我的第一种方法-但是有数千个传感器,每一个传感器每秒都会发布一次。数据库将呈指数级增长:1000*86400=86.4M
每天输入的行数
因此,它不必是JSON
,只是一个可以以这种格式修改的数组。我认为这是使用MySQL
的正确方法。更新文章标题以更好地反映问题。如果您想使用SQL处理传感器值集的各个元素,那么不要将其存储在JSON中。将其作为行存储在中一张普通的桌子
CREATE TABLE facts (
d_date DATE NOT NULL,
second INT NOT NULL,
dim_tag VARCHAR(...) NOT NULL,
sensor_value NUMERIC(5,2) NOT NULL,
PRIMARY KEY (d_date, second)
);
然后,您希望在SQL中执行的查询更简单:
UPDATE facts SET sensor_value = 300.25 WHERE d_date = '2020-03-10' AND second = 4;
SELECT sensor_value FROM facts WHERE d_date = '2020-03-10' AND second < 300;
UPDATE facts SET sensor_value=300.25,其中d_date='2020-03-10',second=4;
从事实中选择传感器值,其中d_日期='2020-03-10',秒<300;
如果您坚持将传感器值存储为JSON数组,那么使用SQL操作单个元素是不简单的。您应该将整个数组提取到应用程序中,然后将JSON解压到一个可以使用代码读取或更改的数组中
这是使用JSON的弱点:很容易将一个值集合插入到一个列中,也很容易将整个集合作为一个单元来获取。但是,如果您想使用SQL逻辑处理该集合的各个元素,这将非常棘手
有人能给你一个答案,让你得到你在上面的问题中所要求的结果吗?可能,但这需要很长时间才能形成,下次你想用这些数据做任何其他类型的任务时,你必须再次寻求帮助
在真正需要离散数据元素时使用JSON不是一种可持续的设计,因为它会导致软件开发成本过高
有关您的其他信息:
MySQL不支持数组数据类型或任何使用数组下标的语法(如您所设想的)
我同意每天8640万行是一个快速增长的速度。在不到两周的时间里,你将达到超过10亿行
可能您需要的是时间序列数据库,而不是关系数据库。时间序列数据库优化类似数据的长流,并在列上运行聚合查询。它们接受这些数据流的快速接收,也比InnoDB之类的数据库引擎更紧凑地存储数据
您应该看一下其中一个:
- (截至2020年3月仍在预览中)
比尔,非常感谢你的见解。我对问题进行了编辑,以包含有关我的系统的更多信息-我想保持它的概括性,使其更适用于将来在这里登陆的人,但我希望附加信息将有助于确定我的问题的解决方案。比尔,谢谢你提供的信息。这是p我使用TimeScaleDB(基于PostGres),因为它接近我熟悉的SQL语法,并且能够用它完成我的项目。很酷,我会在上面的答案中添加TimeScaleDB的链接。我很高兴你找到了一个好的解决方案!