如何在大型MYSQL数据库表中插入新列?

如何在大型MYSQL数据库表中插入新列?,mysql,alter-table,Mysql,Alter Table,我在MYSQL数据库中有这个表,它有大约1000万条记录/行。我想在表中插入一个新的列。然而,一个简单的插入列查询对我来说似乎不太合适 这就是我尝试过的, ALTER TABLE contacts ADD processed INT(11) 我等了大约5个小时,但什么也没发生。有没有办法在这么大的表中插入一个新列 希望我的问题清楚。任何帮助都将不胜感激。如果是生产: 您应该使用Percona工具包 pt online schema change模拟MySQL在内部更改表的方式,但它在您希望更改的

我在MYSQL数据库中有这个表,它有大约1000万条记录/行。我想在表中插入一个新的
。然而,一个简单的插入列查询对我来说似乎不太合适

这就是我尝试过的,
ALTER TABLE contacts ADD processed INT(11)

我等了大约5个小时,但什么也没发生。有没有办法在这么大的表中插入一个新列


希望我的问题清楚。任何帮助都将不胜感激。

如果是生产:

您应该使用
Percona工具包

pt online schema change模拟MySQL在内部更改表的方式,但它在您希望更改的表的副本上工作。这意味着原始表没有被锁定,客户机可以继续读取和更改其中的数据

pt online schema change的工作原理是创建要更改的表的空副本,根据需要对其进行修改,然后将行从原始表复制到新表中。复制完成后,它将移开原始表,并用新表替换它。默认情况下,它还会删除原始表

或者是openark套件的一部分

oak online alter table允许非阻塞alter table操作、表重建和创建表的重影

更改表会比较慢,但不会锁定表

如果不是生产且停机时间正常,请尝试以下方法:

CREATE TABLE contacts_tmp LIKE contacts;
ALTER TABLE contacts_tmp ADD COLUMN ADD processed INT UNSIGNED NOT NULL;
INSERT INTO contacts_tmp (contact_table_fields) SELECT * FROM contacts;
RENAME TABLE contacts_tmp TO contacts, contacts TO contacts_old;
DROP TABLE contacts_old;

是生产吗?你有什么CPU?服务器是否过载?@RomanNewaza Its未在本地oly的生产中。我有4GB ram i5处理器。我不认为服务器超载了。是Linux吗?你能发布正常运行时间的结果吗;免费-m
?抱歉,我不熟悉windows。谢谢,但您能否确保这些工具中的任何一个都能在更短的时间内完成所需的过程?如果是,大约需要多少钱?你有什么建议吗?另外,我需要的是我想在最短的时间内插入列。想知道是否有办法?这将需要更多的CPU时间,我也尝试过这种方法。但是花了太多时间。这就是我提出这个问题的原因。与Postgres和其他数据库相比,MySQL的模式转换能力受到严重限制。像这样的许多操作都需要锁定和重建。