【问题标题】:Alternatives to alter table in mysql在 mysql 中更改表的替代方法
【发布时间】:2019-11-29 06:20:35
【问题描述】:

我们使用 mysql(AWS aurora) 来存储我们在线支付交易的数据。我们的一张表,其中每一行存储特定事务的信息,有超过 10 亿行。

如何为交易添加新属性?由于需要大量时间,因此无法更改此表。

似乎唯一可能的解决方案是创建一个存储每个事务的键值对的新表。假设无法更改表结构,还有其他更有效的方法吗?

【问题讨论】:

  • @juergend "假设改变表结构是不可能的"
  • 如果您无法更改表并需要另一列,那么除了使用附加数据创建一个新表之外别无他法。
  • MySQL 支持在线就地 ddl 操作,因此虽然可能需要一些时间(并且在此期间可能会降低服务器速度),但您可以继续使用该表,我不会完全忽略该选项。如果您已经在 MySQL 8 上,它甚至支持立即添加一列(在某些前提条件下)。
  • @Solarflare,您是否进行了就地 ALTER 以将列添加到具有 > 10 亿行的表中?还需要很长很长的时间。您在此期间所做的任何更改都会在一个固定大小的缓冲区(默认为 128MB)中排队。如果缓冲区填满,则 ALTER 失败。然后缓冲区需要合并到表中,无论 ALTER 失败还是成功。该表在此合并期间被锁定。

标签: mysql database database-design


【解决方案1】:

另一种方法是创建一个并行表。它将与您当前的表具有相同的PRIMARY KEY(但没有AUTO_INCREMENT)。它会有“新”列。

然后你会在 PK 上 JOIN 同时获取旧列和新列。

优点:没有停机时间,没有大的 ALTER 等。

缺点:现在表格被分成两部分。后续添加的列也会遇到同样的困境。

替代方案:将 JSON 列放入该新表中。

优点:非常开放,可以添加更多列。

缺点:不能很好地索引它。 (这取决于您使用的版本。)

【讨论】:

    【解决方案2】:

    在我的工作中,我们有很多表,其中包含超过 10 亿行。开发人员添加或删除列、更改数据类型、添加或删除索引等。任何类型的 ALTER TABLE。

    我们这样做的方法是使用pt-online-schema-change,这是 Percona 提供的免费工具。它允许您进行长时间运行的架构更改,并且您仍然可以在后台进行更改时读取和写入表。

    对大表进行更改仍然需要很长时间。在最大的情况下,需要数周时间。但它不会在此期间阻止您的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多