改变mysql中的表

时间:2015-08-03 09:37:37

标签: mysql performance

我有一个现有的表格,其中有两列ID&名称。该表有大约1000万条目。我想在此电子邮件表中再添加一列。这个新列不能用作任何类型的键,所以这是简单的varchar(30)。我也不想要这个字段的默认值。

ALTER TABLE users 添加栏email VARCHAR(45);

我想知道改变这张桌需要多长时间。这会对所有1000万条目设置为NULL,因为如果这样做会花费很多时间。

2 个答案:

答案 0 :(得分:0)

是否需要花费很多时间。

您可能希望做一些类似的事情,这通常会更快:

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;

答案 1 :(得分:0)

http://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html 指出5.6可以添加一列INPLACE,但在您的情况下可能无关紧要。

如果您没有5.6,则必须复制整个表格才能获得ADD COLUMN

仍然......你问题的答案取决于"更快"的含义。我认为这意味着"最大限度地减少我不能写入表格的时间"。

让我们看看3种方法(5.6之前):

  • ALTER TABLE - 在完成之前无法写入表。不快。
  • blue112'方法 - 您可以写入表格,但不会将其复制到新表格中。还是不快。
  • pt-online-schema-change(参见Percona.com) - 仍然很慢,但你可以在它发生时写。它类似于blue112的方法,添加了TRIGGER以使users_new始终保持最新状态。

底线:5.6 ALGORITHM=INPLACEpt-online-schema-change