【问题标题】:Adding unique constraint to large MySQL table向大型 MySQL 表添加唯一约束
【发布时间】:2017-11-30 20:44:41
【问题描述】:

我在 MySQL 5.6 上有一个 InnoDB 表,我想向 VARCHAR 列添加一个唯一约束(我们称之为列x)。很简单,除了我有超过 500 万行,所以我想在开始之前预测任何问题。

具体问题:

  1. Ballpark 估计这需要多长时间?
  2. 我计划在开始之前删除x 的重复值。但是,如果有人在添加约束的 ALTER 操作正在进行时尝试为 x 插入非唯一值,会发生什么情况?
  3. ADD UNIQUEADD CONSTRAINT UNIQUEADD UNIQUE INDEX有区别吗?

提前致谢。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果您有副本,请使用 ghost 迁移

    【讨论】:

      【解决方案2】:

      只有一种方法可以确定需要多长时间,那就是尝试一下。如果您正在处理无法脱机的生产系统,则需要从最近的备份创建副本并首先尝试迁移。如果它在类似功能的硬件上并且负载很轻,就像您的数据库将在实际迁移期间一样,那么它应该会给您一个想法。

      要进行这样的锁定表的迁移,如果该表很关键,您需要使您的站点脱机。在进行重复数据删除工作之前执行此操作。

      通常UNIQUE INDEX 是处理这些事情的方法,因为它也会自动施加约束。

      【讨论】:

      • 表会被锁定读写还是只写?
      • 在模式更改期间,整个表被锁定,期间,您无法读取或写入它。所有尝试访问它的查询都会积压,直到完成。
      • 你确定吗?这个怎么样:dev.mysql.com/doc/refman/5.7/en/…
      • 据我所知,InnoDB 的 MVCC 不支持模式更改期间的读取。其他引擎可能。我知道 Postgres 对此有更好的支持,但这是一个完全不同的数据库。
      • 您的锁定信息不正确,请参阅:stackoverflow.com/a/35426301/365719。从 5.6 开始,MySQL 允许在不锁定的情况下更改表。在此之前,它只需要一个写锁。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 2018-02-20
      • 2013-03-08
      • 2011-03-23
      • 2013-05-11
      • 2014-02-14
      • 1970-01-01
      相关资源
      最近更新 更多