Php 如何在数据库中存储大量数据并自动删除旧数据
下面是一个免费创建的问题示例: 每隔15秒,我运行一个php脚本,检查+5服务器的状态。它获取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 |
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