Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql中的Alter表_Mysql_Performance - Fatal编程技术网

mysql中的Alter表

mysql中的Alter表,mysql,performance,Mysql,Performance,我有一个具有两列ID和名称的现有表。这个表有大约1000万个条目。我想在此电子邮件表中再添加一列。这个新列不能作为任何类型的键使用,因此它是简单的varchar(30)。我不希望这个字段也有默认值 更改表格用户 添加列emailVARCHAR(45) 我想知道更改这张桌子需要多长时间。这会不会将所有1000万个条目都设置为NULL,因为如果这样做会花费很多时间。会花费很多时间吗 您可能想做类似的事情,通常更快: CREATE TABLE users_new LIKE users; ALTER T

我有一个具有两列ID和名称的现有表。这个表有大约1000万个条目。我想在此电子邮件表中再添加一列。这个新列不能作为任何类型的键使用,因此它是简单的varchar(30)。我不希望这个字段也有默认值

更改表格
用户
添加列
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