Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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 如何在数据库中存储大量数据并自动删除旧数据_Php_Database_Performance_Storage - Fatal编程技术网

Php 如何在数据库中存储大量数据并自动删除旧数据

Php 如何在数据库中存储大量数据并自动删除旧数据,php,database,performance,storage,Php,Database,Performance,Storage,下面是一个免费创建的问题示例: 每隔15秒,我运行一个php脚本,检查+5服务器的状态。它获取ping,状态,版本和motd。数据应存储两周,然后可以删除 目前,我会这样存储它: Table 1: server_ID | name | ip | last_update Table 2: ID | server_ID | status | ping | version | motd |

下面是一个免费创建的问题示例:

每隔15秒,我运行一个php脚本,检查+5服务器的状态。它获取
ping
状态
版本
motd
。数据应存储两周,然后可以删除

目前,我会这样存储它:

Table 1:
server_ID    |    name    |    ip    |    last_update

Table 2:
ID    |     server_ID    |    status    |    ping    |    version    |    motd    |    timestamp
我认为通过这种方式,没有什么是加倍的,我可以很容易地重命名服务器或更改其ip

但我该如何摆脱旧的排位呢?如果每次脚本运行时(每15秒)都这样做是否太多<代码>14*24*60*4=两周内每台服务器80640行

或者我应该如何存储数据,以便能够获得最新的数据以及显示2周折线图的数据

也许是第三个表,它有每小时的数据


编辑:

谢谢你的回答。那么这个呢:

在15秒更新时,我将所有数据放在表1中,但我更新了它,因此每个服务器只有一行数据

然后我每小时使用这个触发器,将当前数据复制到一个新表中,并从中删除所有超过2周的数据


目前我已将表1中的服务器ID和表2中的ID设置为主键,是否有充分的理由将时间戳设置为主键?

您的问题是如何删除行,对吗? 这是可能的删除


从表中删除,其中x=y

我假设您使用的是支持分区的数据库(例如,InnoDb的MySql>=5.5)。在这种情况下,我会将timestamp列添加到第二个表的主键中(说Database2是指table2,对吗?),并创建每日分区。然后删除较旧的数据只需删除超过2周的每日分区(这应该是一个非常快速的操作)


如果您需要以小时分辨率显示2周图表,我建议您首先检查当前设置是否不够快,并且仅当设置太慢时才创建一个附加表,用于存储聚合数据(例如,可能由某个工作人员每隔几分钟查询主表生成)

首先,让我们计算每5秒后2周内输入的记录数

60 / 5 = 12 times in a min
12 * 60 = 720 times in an hour
720 * 24 = 17280 times in a day
17280 * 14 = 241920 times two weeks

241920 * 5 = 1209600 records
每天都有大量的数据输入。我假设您使用的是MySQL数据库。因为您希望最新数据显示在折线图中。您必须创建事件触发器

事件触发器 仅当您有权限执行此操作时才使用事件触发器。因此,首先必须按如下所示设置事件触发器:

SET GLOBAL event_scheduler = ON;
现在您的事件触发器处于启用状态,请创建以下事件触发器来执行操作:

CREATE EVENT 
    event_name
ON SCHEDULE AT
EVERY 5 MINUTE 
DO
  DELETE 
  FROM
     Database2 
  WHERE
     timestamp < (CURRENT_TIMESTAMP() - (60*60*24*14) )
创建事件
事件名称
如期在
每5分钟
做
删除
从…起
数据库2
哪里
时间戳<(当前时间戳()-(60*60*24*14))
每5分钟安排一次,并从当前时间和日期戳中删除2周前的记录。希望这能解决你的问题。因为该表只有2周的记录,所以每5分钟删除一次旧记录,并且已经每5秒插入一次

编辑问题 编辑后的问题改变了很多事情。现在,在表2中连续输入数据。现在,每15秒更新一次表1,每小时创建一个新表并删除旧条目。我不明白你想要实现什么。但是,我会在最后回答关于主键的问题

什么是主键
  • 主键约束唯一地标识数据库表中的每个记录

  • 主键必须包含唯一的值

  • 主键列不能包含空值

  • 每个表都应该有一个主键,并且每个表只能有一个主键


现在它取决于您的需求,如果您希望单个时间戳条目应该存在,那么将其更改为时间戳,但是如果您希望单个服务器的单个条目,那么将其更改为服务器。但是,我建议您使用另一种方法,即创建一个单独的列作为主键的ID,并使用两列(即服务器ID和时间戳)的组合创建唯一键的索引,因为没有提到必须使用基于SQL的数据库,为了好玩,您可以避免将其存储在关系数据库结构中

一个选项是散列,但也可以使用排序集,例如。使用排序集,您可以非常快速地添加、删除或更新元素(时间与元素数量的对数成比例)

排序集的每个成员都与score相关联,score用于将排序集从最小到最大排序。虽然成员是唯一的,但分数可能会重复

您的分数将是历元时间(或类似时间),成员可以是您要存储的数据的JSON对象

因为这种类型的操作非常快,所以您可以轻松地回调所有JSON对象并自行排序。您可能希望将历元时间存储在JSON对象中以确保唯一性。请注意,相对于Redis所能处理的,每台服务器80640行是很小的。加上:

ZADD yourset 1383553120 "<JSON OBJECT>"
最后一次辩论应该是两周前的大纪元


,所以这可能是你可以研究的。

谢谢你,你已经帮了我很多。我更新了我的问题,也许你可以给我这样的评论。嘿,我想我把所有的都保存在一个表中,但是当php脚本运行时,它不会创建一个新条目,它只会更新行。然后,我每小时运行一个脚本,将第一个表中的行复制到另一个表中,并在第二个表中删除旧的条目。根据主键,按id而不是按时间戳对数据库进行排序不是更容易吗?因此,它只需检查第一个id,该id已过期且
ZREMRANGEBYSCORE yourset -inf 1382344314