我一直在考虑在下表结构中保留历史记录:
`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
引擎在这里有用吗?或者我是否因为索引而无需担心?
答案 0 :(得分:1)
假设它的mysql:
对于历史表,您应该考虑partitioning您可以为您设置最佳分区规则,并查看您有哪些查询有2种选择:
一个。按日期划分(例如1个分区= 1个月)
湾按用户划分(假设您有300个分区,1个分区= 100000个用户)
如果您将使用分区修剪(here)
您可以为用户使用复合索引,日期(它将用于前2个查询)
避免使用INSERT
语句,当您使用大量数据LOAD DATA时(表格已分区,这将无效)
最重要的是......大量数据的最佳引擎是MyISAM