MySQL ALTER TABLE在小表中占用很长时间

用户名

我的场景中有两个表

table1, which has about 20 tuples
table2, which has about 3 million tuples

table2 has a foreign key referencing table1 "ID" column.

当我尝试执行以下查询时:

ALTER TABLE table1 MODIFY vccolumn VARCHAR(1000);

它需要永远。为什么要花这么长时间?我读过它不应该,因为它只有20个元组。

有什么方法可以在不导致服务器停机的情况下加快速度吗?因为查询也锁定表。

比尔·卡温

我猜ALTER TABLE正在等待元数据锁定,并且它实际上尚未开始更改任何内容。

什么是元数据锁定?

对表运行任何查询(如SELECT / INSERT / UPDATE / DELETE)时,它必须获取元数据锁。这些查询不会互相阻塞。该类型的任何数量的查询都可以具有元数据锁定。

但是,诸如CREATE / ALTER / DROP / TRUNCATE / RENAME之类的DDL语句或事件CREATE TRIGGER或LOCK TABLES,必须获得独占的元数据锁。如果任何事务仍然保留元数据锁,则DDL语句等待。

您可以证明这一点。打开两个终端窗口,然后在每个窗口中打开mysql客户端。

  • 视窗1: CREATE TABLE foo ( id int primary key );
  • 视窗1: START TRANSACTION;
  • 窗口1:SELECT * FROM foo;-表格没有数据没关系

  • 窗口2:DROP TABLE foo;-请注意

  • 视窗1: SHOW PROCESSLIST;

    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    | Id  | User | Host      | db   | Command | Time | State                           | Info             | Rows_sent | Rows_examined |
    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    | 679 | root | localhost | test | Query   |    0 | starting                        | show processlist |         0 |             0 |
    | 680 | root | localhost | test | Query   |    4 | Waiting for table metadata lock | drop table foo   |         0 |             0 |
    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    

您可以看到放置表正在等待表元数据锁定。等一下 等待多长时间?直到窗口1中的事务完成为止。最终它将在lock_wait_timeout几秒钟后超时(默认情况下,它设置为1 year)。

  • 视窗1: COMMIT;

  • 窗口2:请注意,它停止等待,并立即放下桌子。

所以,你可以做什么?确保没有长时间运行的事务阻塞您的ALTER TABLE。即使是对您的表进行了快速SELECT的事务,也将保持其元数据锁定,直到事务提交。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MySQL ALTER TABLE挂起

来自分类Dev

MySQL ALTER TABLE删除表

来自分类Dev

MySQL ALTER TABLE删除表

来自分类Dev

MySQL ALTER列到表中的最后位置

来自分类Dev

MySQL ALTER列到表中的最后位置

来自分类Dev

MySQL ALTER表多列键

来自分类Dev

MySQL ALTER IGNORE TABLE重复错误

来自分类Dev

MySQL“ ALTER IGNORE TABLE”语法错误

来自分类Dev

ALTER TABLE添加主键不认可的MySQL

来自分类Dev

MySQL C#中的alter表错误

来自分类Dev

MySQL ALTER表查询中的AFTER关键字

来自分类Dev

使用MySQL中的Alter表将日期转换为日期时间或时间戳

来自分类Dev

MySQL ALTER TABLE在存储过程中带有参数

来自分类Dev

MySQL 中 ALTER TABLE 的正确语法是什么?

来自分类Dev

MySQL中的Alter Table仅使用一个核心

来自分类Dev

mysql零停机ALTER表排序(percona,openark等)

来自分类Dev

Mysql Alter 表可以转换为默认值吗?

来自分类Dev

MySQL:ALTER TABLE如果列不存在

来自分类Dev

MYSQL:基于SELECT结果的ALTER TABLE DROP FOREIGN KEY

来自分类Dev

MySQL 5.7.9是否删除了对ALTER IGNORE TABLE的支持?

来自分类Dev

MySQL alter table查询的正确语法是什么?

来自分类Dev

MySQL的失败的正在积极地写入ALTER TABLE

来自分类Dev

执行ALTER TABLE时MySQL中出现错误1005

来自分类Dev

MySQL ALTER TABLE AUTO_INCREMENT和ORDER BY

来自分类Dev

mysql 5.6 alter table drop列(如果存在)

来自分类Dev

选择在MySql表上花费很长时间的count(*)

来自分类Dev

vertica中的ALTER表

来自分类Dev

在MySQL数据库中查询需要很长时间

来自分类Dev

更新mysql中的单个值需要很长时间->超时