Php 具有旋转数据的mysql数据库
我不确定这个问题的最佳表达方式 我有一个mysql数据库,需要检索和存储过去的24个数据值,并且数据总是需要是最后24个数据值 我有这个充分的工作,但我相信一定有更好的方法来做它 刚才,我的mysql数据库有id、时间戳等列,然后是24个数据列:Php 具有旋转数据的mysql数据库,php,mysql,Php,Mysql,我不确定这个问题的最佳表达方式 我有一个mysql数据库,需要检索和存储过去的24个数据值,并且数据总是需要是最后24个数据值 我有这个充分的工作,但我相信一定有更好的方法来做它 刚才,我的mysql数据库有id、时间戳等列,然后是24个数据列: data_01 data_02 data_03 data_04 data_05 etc 不同ID有多行 我每小时运行一次cron作业,删除列“data_24”,然后重命名所有列: data_01 -> data_02 data_02 ->
data_01
data_02
data_03
data_04
data_05
etc
不同ID有多行
我每小时运行一次cron作业,删除列“data_24”,然后重命名所有列:
data_01 -> data_02
data_02 -> data_03
data_03 -> data_04
data_04 -> data_05
data_05 -> data_06
etc
然后添加一个新的空白列:
data_01
然后将新数据添加到此新的空白列中
这听起来是一个明智的方法,还是有更好的方法
我对这种方法的担心是,在检索新数据之前,必须先删除、重命名和添加列,以便存在用于添加数据的新列
如果数据检索因任何原因失败,我的表就会有一个数据值为NULL的列。为类似的内容重命名列不是一个好主意 我很好奇您如何插入和更新这些数据,但一定有更好的方法 两件似乎可行的事情: 不重命名列,但将数据移动到下一列:
update YourTable
set data1 = :newvalue,
data2 = data1,
data3 = data2,
...;
或者将数据分散到24行而不是24列。每个数据都是表(或id为外键的新表)中的一行。每次插入新值时,您还可以删除同一id的最旧值。您可以在一个原子事务中执行此操作,这样每个id的行数不会超过或少于24行
insert into YourTable(id, data)
values (:id, :newvalue);
delete from YourTable
where id = :id
order by timestamp desc
limit 1;
这将把行数(但不是数据量)乘以24,因此对于1000行(如您所提到的),您所说的是24000行,如果您有适当的索引,这仍然是微不足道的
我们在MySQL中有超过1亿行的表。操作24000行要比重写一个包含1000行的完整表容易得多,这基本上是通过重命名列来完成的
因此,第二种选择当然有我的偏好。它将为您提供一个简单的结构,如果您决定不清理旧数据,或将其移动到单独的工作,或坚持使用100项而不是24项,那么您可以通过更改3行代码轻松做到这一点,老实说,这看起来不是一种明智的做法,而不是彻底修改表结构和应用程序 依我看,拥有多行而不是宽表要灵活得多 您可以定义列(id、实体id、已创建)。然后,您将能够以“日志”方式写入记录 当您需要以与以前相同的方式选择数据时,可以使用MySQL视图进行选择。差不多
CREATE VIEW my_view AS
SELECT data_01, ..., data_24 -- here you should put the aggregated values aliased as data_01 ... data_24
FROM my_table
WHERE my_table.created >= DATE_SUB(NOW(), INTERVAL 1 DAY)
GROUP BY ... -- here you should aggregate the fields by hours
ORDER BY created;
您不能使用仅使用LIMIT收集最后24条记录的汇总表视图吗?您的意思是始终收集和存储数据,并且仅查看最后24条记录?这将很快失去控制,收集如此多的数据。我只需要最后24个,所以保留所有数据是一种浪费。你从哪里获得数据_01的数据,然后更新/插入?您只需进行自连接,然后从data_24=data_23滚动数据,依此类推。并将数据_01更新为传入值。水平存储比垂直存储更具挑战性。只需在视图中使用最后24个数据。独立定义您自己的删除时间范围。1小时,1天,1分钟。根据您自己的要求定义它。我在表中有1000多行,所以最好的方法是将24个数据项作为列。从API的JSON调用中检索新数据。id是固定的,所以我只需使用updatewhere id='id'命令将新数据插入“data\u 01”列。欢迎您选择我的第一个建议,但请注意,对于MySQL来说,24000行仍然是微不足道的,而且比实际修改表要容易得多(这将强制MySQL在后台创建临时表,移动所有数据,重命名表,删除旧表)