为什么简单地更新此表以添加列需要一个多小时?该表有1500万行。它具有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操作的经验。
无论如何,如果您需要继续使用alter table,也许以下资源可以为您提供帮助: