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