我正在使用 MySQL table 来记录用户数据(1000 新行/分钟)。 2天后如何轮换行?
I'm using a MySQL table to log user data (1000 new rows / min). How can I rotate the rows after 2 days?
举个例子,假设我有一个站点,用户可以在其中添加无限的 cron 作业(频率为 1 秒),并且我将每个作业的结果记录在 Mysql table 中。
现在因为我没有无限存储空间(而且因为我不想让我的 table 变得很大)我想将日志历史记录限制为仅持续 30 天。
以前在 Mysql 的旧版本上,我是 运行 DELETE FROM logs where created_at < DATE_SUB(NOW(), INTERVAL 30 DAY)
来清理我的 table,但这会导致我的 table经常崩溃并损坏。它还在 DELETE
期间锁定了我的 table,这使得网站非常慢。
无论如何,我如何为我的 Mysql table 或行实施行轮换(如日志轮换)?删除行是我唯一的选择还是有其他选择?
您可以使用数据库分区
https://dev.mysql.com/doc/refman/5.7/en/partitioning-types.html
例子
PARTITION BY HASH( MONTH(column) )
这给出了 7 个分区。然后你可以简单地
ALTER TABLE t1 TRUNCATE PARTITION p0;
删除单个分区。
This 讨论了使用 PARTITION BY RANGE
作为 "deleting" 旧数据的一种非常有效的方式。它解释了如何做 DROP PARTITION
(比 TRUNCATE
更有效)并每天或每周创建一个新分区。
举个例子,假设我有一个站点,用户可以在其中添加无限的 cron 作业(频率为 1 秒),并且我将每个作业的结果记录在 Mysql table 中。
现在因为我没有无限存储空间(而且因为我不想让我的 table 变得很大)我想将日志历史记录限制为仅持续 30 天。
以前在 Mysql 的旧版本上,我是 运行 DELETE FROM logs where created_at < DATE_SUB(NOW(), INTERVAL 30 DAY)
来清理我的 table,但这会导致我的 table经常崩溃并损坏。它还在 DELETE
期间锁定了我的 table,这使得网站非常慢。
无论如何,我如何为我的 Mysql table 或行实施行轮换(如日志轮换)?删除行是我唯一的选择还是有其他选择?
您可以使用数据库分区
https://dev.mysql.com/doc/refman/5.7/en/partitioning-types.html
例子
PARTITION BY HASH( MONTH(column) )
这给出了 7 个分区。然后你可以简单地
ALTER TABLE t1 TRUNCATE PARTITION p0;
删除单个分区。
This 讨论了使用 PARTITION BY RANGE
作为 "deleting" 旧数据的一种非常有效的方式。它解释了如何做 DROP PARTITION
(比 TRUNCATE
更有效)并每天或每周创建一个新分区。