Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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
Php 具有旋转数据的mysql数据库_Php_Mysql - Fatal编程技术网

Php 具有旋转数据的mysql数据库

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 ->

我不确定这个问题的最佳表达方式

我有一个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_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在后台创建临时表,移动所有数据,重命名表,删除旧表)