MySQL的alter table查询非常慢

标签 mysql sql alter-table

为什么简单地更新此表以添加一列需要一个多小时?该表有 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/

相关文章:

oracle11g - 更改表移动命令 - ORACLE

MySQL 在计算列的别名上使用内部联接

mysql - 关闭查询MYSQL的查询

php - 从 MySQL 中删除行不起作用

sql - 计数为零的项目列表不存在

sql - 为 SQL Server 中的常用查询创建适当的索引

MySQL 在设置默认列日期时间时添加一些小时

mysql - 如何更改超过 1 列的表列数据类型?

mysql - wordpress查询2组元键

MYSQL: 子句 where 比较整数值