mysql中的Alter表
我有一个具有两列ID和名称的现有表。这个表有大约1000万个条目。我想在此电子邮件表中再添加一列。这个新列不能作为任何类型的键使用,因此它是简单的varchar(30)。我不希望这个字段也有默认值 更改表格mysql中的Alter表,mysql,performance,Mysql,Performance,我有一个具有两列ID和名称的现有表。这个表有大约1000万个条目。我想在此电子邮件表中再添加一列。这个新列不能作为任何类型的键使用,因此它是简单的varchar(30)。我不希望这个字段也有默认值 更改表格用户 添加列emailVARCHAR(45) 我想知道更改这张桌子需要多长时间。这会不会将所有1000万个条目都设置为NULL,因为如果这样做会花费很多时间。会花费很多时间吗 您可能想做类似的事情,通常更快: CREATE TABLE users_new LIKE users; ALTER T
用户
添加列email
VARCHAR(45)
我想知道更改这张桌子需要多长时间。这会不会将所有1000万个条目都设置为NULL,因为如果这样做会花费很多时间。会花费很多时间吗 您可能想做类似的事情,通常更快:
CREATE TABLE users_new LIKE users;
ALTER TABLE users_new ADD COLUMN email varchar(45);
INSERT INTO users_new (fields_in_users_table) SELECT * FROM users;
RENAME TABLE users TO users_old, users_new TO users;
DROP TABLE users_old;
指出5.6可以在原处添加一列,
,但其中的注意事项在您的情况下可能并不重要
如果没有5.6,则必须复制整个表以实现ADD列
还是。。。你问题的答案取决于“更快”的含义。我假设它的意思是“最小化我不能写入表的时间”
让我们看看3种方法(5.6之前):
——在完成之前无法写入表。不快ALTER TABLE
- blue112的方法——您可以写入表,但不会复制到新表。还是不快
- pt在线模式更改(参见Percona.com)——仍然很慢,但您可以在它发生时编写。它就像blue112的方法一样,添加了一个
,让触发器
用户始终保持最新
一句话:5.6与
ALGORITHM=INPLACE
,或者pt-online-schema-change
这怎么可能更快呢。在本例中,我实际上是将旧用户表的所有数据复制到新用户表中。这就好像我将读取所有1000万条记录,然后再次写入。我使用的是5.6。阅读参考后,我理解如果我使用Algorithem=inplace,如果我不提供任何默认值,它将不会为每个条目赋值,并且添加列的速度应该足够快,可以再次编辑该表。随后编辑该表以实际填充值——这将需要时间。你可能会一次做一点。一个巨大的更新可能会比一个非就地更改更具侵入性。实际上,我只想添加一列,然后根据需要填充字段的值。因此,我的表稍后可以填充新添加列的详细信息。这意味着我下面的查询可以正常工作。ALTER TABLE users ADD列email VARCHAR(45)算法=INPLACE