有效维护大量历史数据

时间:2013-04-12 14:57:50

标签: mysql

我一直在考虑在下表结构中保留历史记录:

`id` bigint unsigned not null auto_increment,
`userid` bigint unsigned not null,
`date` date not null,
`points_earned` int unsigned not null,
primary key (`id`),
key `userid` (`userid`),
key `date` (`date`)

这将允许我做一些类似SO的信誉图(我加入网站后可以看到我的代表收益)。

这是问题所在:我只是进行了一个简单的计算:

SELECT SUN(DATEDIFF(`lastclick`,`registered`)) FROM `users`

结果差不多25,000,000个工作日。如果我打算每个用户每天保留一行,那就是一张[咒骂]大表,我期待进一步增长。即使我排除了用户没有上网的日子,这仍然是巨大的。

有人可以提供有关维护如此大量数据的建议吗?将在此表上运行的唯一查询是:

SELECT * FROM `history` WHERE `userid`=?
SELECT SUM(`points_earned`) FROM `history` WHERE `userid`=? AND `date`>?
INSERT INTO `history` VALUES (null,?,?,?)

例如,ARCHIVE引擎在这里有用吗?或者我是否因为索引而无需担心?

1 个答案:

答案 0 :(得分:1)

假设它的mysql:

  1. 对于历史表,您应该考虑partitioning您可以为您设置最佳分区规则,并查看您有哪些查询有2种选择:
    一个。按日期划分(例如1个分区= 1个月)
    湾按用户划分(假设您有300个分区,1个分区= 100000个用户)
    如果您将使用分区修剪(here

  2. ,这将帮助您分配
  3. 您可以为用户使用复合索引,日期(它将用于前2个查询)

  4. 避免使用INSERT语句,当您使用大量数据LOAD DATA时(表格已分区,这将无效)

  5. 最重要的是......大量数据的最佳引擎是MyISAM