为什么简单地更新此表以添加一列需要一个多小时?该表有 15M 行。它有 2 个索引和一个单键主键。 ALTER TABLE 查询已处于“复制到 tmp 表”状态 1 小时 15 分钟。
ALTER TABLE `frugg`.`item_catalog_map`
ADD COLUMN `conversion_url` TEXT NULL DEFAULT NULL
表:
mysql> describe item_catalog_map;
+------------------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------------+---------------+------+-----+---------+-------+
| catalog_unique_item_id | varchar(255) | NO | PRI | NULL | |
| catalog_id | int(11) | YES | MUL | NULL | |
| item_id | int(11) | YES | MUL | NULL | |
| price | decimal(10,2) | YES | | 0.00 | |
+------------------------+---------------+------+-----+---------+-------+
mysql> show index from item_catalog_map;
+------------------+------------+----------------------+--------------+------------------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+------------------+------------+----------------------+--------------+------------------------+-----------+-------------+----------+--------+------+------------+---------+
| item_catalog_map | 0 | PRIMARY | 1 | catalog_unique_item_id | A | 15485115 | NULL | NULL | | BTREE | |
| item_catalog_map | 1 | IDX_ACD6184FCC3C66FC | 1 | catalog_id | A | 18 | NULL | NULL | YES | BTREE | |
| item_catalog_map | 1 | IDX_ACD6184F126F525E | 1 | item_id | A | 15485115 | NULL | NULL | YES | BTREE | |
+------------------+------------+----------------------+--------------+------------------------+-----------+-------------+----------+--------+------+------------+---------+
最佳答案
MySQL 的 ALTER TABLE 性能可能会成为非常大的表的问题。 MySQL 执行 大多数更改是通过创建一个具有所需新结构的空表,将旧表中的所有数据插入新表,然后删除旧表。这可能需要很长时间,尤其是在内存不足且表很大并且有很多索引的情况下。许多人都曾经历过需要数小时或数天才能完成的 ALTER TABLE 操作。
无论如何,如果您需要继续更改表,也许以下资源可以帮助您:
关于MySQL的alter table查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12774709/