我终于有时间进行测试了。这只是一个包含 12k 和 48k 记录的小规模测试。
存储这两种数据的表具有以下结构:
CREATE TABLE IF NOT EXISTS `stat_test` (
`id_off` int(11) NOT NULL,
`stat_date` date NOT NULL,
`stat_count` int(11) NOT NULL,
`stat_type` tinyint(11) NOT NULL,
PRIMARY KEY (`id_off`,`stat_date`,`stat_type`),
KEY `id_off` (`id_off`),
KEY `stat_count` (`stat_count`)
) ENGINE=InnoDB DEFAULT CHARSET=latin2;
另外两个表的结构如下:
CREATE TABLE IF NOT EXISTS `stat_test_other` (
`id_off` int(11) NOT NULL,
`stat_date` date NOT NULL,
`stat_count` int(11) NOT NULL,
PRIMARY KEY (`id_off`,`stat_date`),
KEY `id_off` (`id_off`),
KEY `stat_count` (`stat_count`)
) ENGINE=InnoDB DEFAULT CHARSET=latin2;
在 12k 条记录的情况下,2 个单独的表实际上比存储所有内容的表略大,但在 48k 条记录的情况下,两个表更小,而且值显着。
最后我没有把数据分成两张表来解决我最初的空间问题。通过删除冗余的id_off 索引并调整数据类型(在大多数情况下unsigned smallint 足以存储我需要的所有值),我设法大大减小了数据库的大小。请注意,最初 stat_type 也是 int 类型,对于此列 unsigned tinyint 就足够了。总而言之,这将数据库的大小从 1.5GB 减少到了 600MB(我的数据库限制仅为 2GB)。此解决方案的另一个优点是我不必修改一行代码即可使一切正常运行(由于该站点是由其他人编写的,因此我不必花费数小时试图理解源代码) .