【发布时间】:2014-03-16 13:09:16
【问题描述】:
我的一个数据库表已经变得非常大,以至于我认为它会影响我网站的性能(它肯定会使备份速度变慢)。
它有大约 13,000,000 行,大小为 4.2 GiB,其中 1.2 GiB 是数据。
结构如下:
CREATE TABLE IF NOT EXISTS `t1` (
`id` int(10) unsigned NOT NULL,
`int2` int(10) unsigned NOT NULL,
`int3` int(10) unsigned NOT NULL,
`int4` int(10) unsigned NOT NULL,
`char1` varchar(255) NOT NULL,
`int5` int(10) NOT NULL,
`char2` varchar(1024) DEFAULT NULL,
`char3` varchar(1024) NOT NULL,
PRIMARY KEY (`id`,`int2`,`int3`,`int4`),
KEY `key1` (`id`,`int2`,`char1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
此表中的常见操作是插入和选择,行从不更新,很少删除。 int2 是一个正在运行的版本号,这意味着通常只选择该 ID 的 int2 值最高的行。
我一直在考虑几种优化方法,我想知道要追求哪一种:
- char1(在索引中)实际上只包含大约 40,000 个不同的字符串。我可以将字符串移动到第二个表(idchar -> char)中,然后将 id 保存在我的主表中,代价是在插入和选择期间执行额外的 id 查找步骤。
- char2 和 char3 通常为空。我可以将它们移动到一个单独的表中,然后在选择中执行 LEFT JOIN。
- 即使 char2 和 char3 包含数据,它们通常也短于 1024 个字符。我可能可以将它们缩短到 200 左右。
您认为其中哪一项最有前途?减小 MySQL InnoDB 表中的行大小(通过将 char1 变为整数或通过删除/调整列大小)实际上对性能有很大影响吗?
谢谢
【问题讨论】:
-
您考虑过partitioning 您的餐桌吗?关于慢速备份,您是否考虑过使用二进制日志进行增量备份或使用复制从属服务器作为备份服务器(如Database Backup Methods 中所述)?
-
我没有考虑过分区,没有。你认为这对我的情况有什么帮助?阅读帮助页面,我并没有真正看到我的问题的实际应用是什么。
-
这真的取决于你面临的实际问题是什么。您只提到了慢速备份:如果您没有任何其他性能问题,那么我不一定认为分区会给您带来任何好处。