【问题标题】:RENAME faster than DROP+ADD in MySQL alter table在 MySQL 更改表中重命名比 DROP+ADD 快
【发布时间】:2010-12-04 00:04:55
【问题描述】:

我正在执行一些 MySQL 表维护,这意味着删除一些冗余列并添加一些新列。

要删除的某些列与要添加的列的类型相同。如果我利用这一点并重用一些现有的列,该过程会更快吗?

我的理由是更改列名应该是简单的表元数据更改,而删除和添加列意味着要么在文件末尾找到空间(分割数据),要么用正确的列重建每一行,以便它们在磁盘上的同一位置。

有问题的引擎是 MyISAM,我不知道它会如何处理这个问题,所以我想听听以前遇到过同样情况的任何人的意见!

【问题讨论】:

  • 你对更新和删除+插入有疑问吗?我不确定明白!什么是你“重用”的?
  • ALTER TABLE with DROP COLUMN and ADD COLUMN vs ALTER TABLE with CHANGE COLUMN

标签: sql mysql optimization alter-table


【解决方案1】:

除非您遇到严重性能问题,否则我不会采用重命名方法 - 因为您将留下所有脏数据。

此外,通过删除表,您将导致重新构建任何索引 - 每隔一段时间这是一个好主意...

马丁

【讨论】:

  • 谢天谢地,这些列没有被使用。这是唯一的担忧吗?我更担心我在假设 MySQL 是如何工作的!至于性能,您提出了一个很好的观点,但它是一个实时站点,所以如果可以避免的话,没有停机时间比 20 分钟的停机时间更可取。
【解决方案2】:

我会删除这些列。无论哪种方式,您都会有碎片。这应该在您的定期维护计划中处理。您可以在进行大量修改操作后加速它们。

【讨论】:

    【解决方案3】:

    如果您不知道,在 Myisam 表中,每个 ALTER TABLE 操作都会复制整个表,因此该表将在您的服务器需要复制表的时间内被锁定。

    【讨论】:

      【解决方案4】:

      我使用了相同的逻辑,但被刺痛了,因为即使进行了本应不需要重写表的更改(即表重命名),MySQL 错误导致它认为这是需要重写表的更改.

      如果您正在处理的字段是日期、日期时间或时间戳字段,您很可能会遇到这种情况,这意味着您应该假设它必须进行完全重写并以这种方式进行计划。

      【讨论】:

        猜你喜欢
        • 2012-02-12
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        • 2018-09-21
        • 2020-02-23
        • 2013-09-30
        相关资源
        最近更新 更多