1. 微擎百科首页
  2. 服务器运维

加快ALTER TABLE 修改字段默认值操作的速度

MySql的ALTER TABLE操作性能对大表来说是个大问题。MySql执行大部分修改表结构操作的方式是用新的结构创建一个新表,从旧表中查出所有数据插入新表,然后删除旧表。这样操作可能需要花费很长时间,如果内存不足而表又很大,而且还有很多索引的情况下尤其如此。

不是所有的ALTER TABLE 操作都会引起表的重建,例如,有2种方法可以改变或者删除一个列的默认值(一种方法很快,另一种方法很慢)。下面举个例子,修改电影表的默认租赁期限,从3天修改为5天,该表中有1000条数据。

方法1:MODIFY COLUMN
mysql->ALTER TABLE file MODIFY COLUMN rental_duration TINYINT(3) NOT NULL DEFAULT 5

SHOW STATUS显示这个语句做了1000次读和1000次插入操作。换句话说,它拷贝了整张表到一个新表,甚至列的类型、大小和可否为NULL属性都没变。

理论上,MySql可以跳过创建新表的步骤。列的默认值实际上存在表对应的.frm文件中,所以可以直接修改这个文件而不需要改动表本身。然而MySql还没有采用这种优化的方法,所有的MODIFY COLUMN操作都会导致表重建。

方法2:ALTER COLUMN
mysql->ALTER TABLE file ALTER COLUMN rental_duration  SET DEFAULT 5

这个语句会直接修改.frm文件而不涉及表数据,所以这个操作是非常快的。

本文来自投稿,不代表微擎百科立场,如若转载,请注明出处:https://www.w7.wiki/server/3040.html

发表评论

登录后才能评论