我正在执行一些 MySQL 表维护,这意味着删除一些冗余列并添加一些新列。
一些要删除的列与要添加的列的类型相同。如果我利用这一点并重用一些现有的列,该过程会更快吗?
我的理由是更改列名应该是一个简单的表元数据更改,而删除和添加列意味着要么在文件末尾找到空间(分割数据),要么用正确的列重建每一行,使它们保持一致放在磁盘上。
有问题的引擎是 MyISAM,我不知道它会如何处理这个问题,所以我想听听以前遇到过同样情况的人的意见!
我正在执行一些 MySQL 表维护,这意味着删除一些冗余列并添加一些新列。
一些要删除的列与要添加的列的类型相同。如果我利用这一点并重用一些现有的列,该过程会更快吗?
我的理由是更改列名应该是一个简单的表元数据更改,而删除和添加列意味着要么在文件末尾找到空间(分割数据),要么用正确的列重建每一行,使它们保持一致放在磁盘上。
有问题的引擎是 MyISAM,我不知道它会如何处理这个问题,所以我想听听以前遇到过同样情况的人的意见!
除非您在性能方面遇到严重问题,否则我不会采用重命名方法 - 因为您将留下所有脏数据。
此外,通过删除表,您将导致重新构建任何索引 - 每隔一段时间这是一个好主意......
马丁
我会删除列。无论哪种方式,您都会有碎片。这应该在您的定期维护计划中处理。在进行大量修改操作后,您可以加速它们。
如果您不知道,在 Myisam 表中,每个 ALTER TABLE 操作都会复制整个表,因此该表将在您的服务器需要复制表的时间内被锁定。
我使用了相同的逻辑,并且被刺痛了,因为即使进行了本应不需要重写表的更改(即表重命名),一个 MySQL 错误导致它认为这是一个需要重写表的更改。
如果您正在处理的字段是日期、日期时间或时间戳字段,您很可能会遇到这种情况,这意味着您应该假设它必须进行完全重写并以这种方式进行计划。