【问题标题】:Optimizing MySQL Table Structure and impact of row size优化 MySQL 表结构和行大小的影响
【发布时间】: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 值最高的行。

我一直在考虑几种优化方法,我想知道要追求哪一种:

  1. char1(在索引中)实际上只包含大约 40,000 个不同的字符串。我可以将字符串移动到第二个表(idchar -> char)中,然后将 id 保存在我的主表中,代价是在插入和选择期间执行额外的 id 查找步骤。
  2. char2 和 char3 通常为空。我可以将它们移动到一个单独的表中,然后在选择中执行 LEFT JOIN。
  3. 即使 char2 和 char3 包含数据,它们通常也短于 1024 个字符。我可能可以将它们缩短到 200 左右。

您认为其中哪一项最有前途?减小 MySQL InnoDB 表中的行大小(通过将 char1 变为整数或通过删除/调整列大小)实际上对性能有很大影响吗?

谢谢

【问题讨论】:

  • 您考虑过partitioning 您的餐桌吗?关于慢速备份,您是否考虑过使用二进制日志进行增量备份或使用复制从属服务器作为备份服务器(如Database Backup Methods 中所述)?
  • 我没有考虑过分区,没有。你认为这对我的情况有什么帮助?阅读帮助页面,我并没有真正看到我的问题的实际应用是什么。
  • 这真的取决于你面临的实际问题是什么。您只提到了慢速备份:如果您没有任何其他性能问题,那么我不一定认为分区会给您带来任何好处。

标签: mysql sql innodb


【解决方案1】:

有多种选择。从您所说的来看,将char1 移动到另一张桌子似乎很合理。在某些情况下,额外的查找甚至可能比将原始数据存储在表中更快。 (当重复值导致表大于所需时,尤其是当较大的表可能大于可用内存时,会发生这种情况。)并且,这将节省数据表和相应索引中的空间。

如果不深入了解您的系统和查询负载,很难说对性能的确切影响。

char3char4 移动到另一个表的影响很小。链接到另一张桌子的开销会消耗掉空间上的任何收益。您可以通过将它们存储为varchar(255) 而不是varchar(1024) 来为每条记录节省几个字节。

如果您有一个自然的分区键,那么分区绝对是一种选择,尤其是在减少备份时间方面。这对于事务样式表非常方便,其中记录被插入并且从不或很少修改。另一方面,如果记录包含客户记录并且可以随时修改,那么您仍然需要备份所有分区。

【讨论】:

  • 我在最初的帖子中添加了关于常见查询的注释。如果我正确理解您的帖子,这意味着我可能会发现分区有用吗?
  • @Nils 。 . .对于这种情况,分区是加快备份速度的最佳解决方案(一次只能备份一个分区)。通过将char1 移动到另一个表中,您仍然可以获得一些性能优势。
  • 酷,谢谢!仅定义分区就足够了,还是我还必须放弃通常的“mysqldump”备份方法才能利用它们?
  • @Nils 。 . .您将需要修改备份方法以仅备份最近的分区。
【解决方案2】:

有几个因素可能会影响数据库的性能。分区是明确的最佳选择,但并非总是可以做到。如果您在插入之前搜索 char1,那么分区可能会成为问题,因为您必须搜索所有部分以查找密钥。您必须分析数据是如何生成的,最重要的是如何对该表进行查询。这是关键,因此您应该在此表上发布您的查询。在 char2 和 char3 的情况下,移动到另一个表不会有任何区别。您还应该提及数据的物理分布。您是否使用单个数据文件?数据文件是否与 SO 在同一物理磁盘上?提供更多详细信息,以便我们为您提供更多帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2011-06-12
    相关资源
    最近更新 更多