MySQL RENAME TABLE 语句如何工作/执行?

Posted

技术标签:

【中文标题】MySQL RENAME TABLE 语句如何工作/执行?【英文标题】:How does MySQL's RENAME TABLE statment work/perform? 【发布时间】:2010-10-27 12:17:20 【问题描述】:

mysql 有一个 RENAME TABLE statemnt 允许您更改表的名称。

手册中提到

重命名操作是原子完成的,这意味着没有其他会话可以 在重命名运行时访问任何表

该手册没有(据我所知)说明如何完成重命名。是否创建了表的整个副本,给了一个新名称,然后删除了旧表?还是 MySQL 在幕后做了一些魔术来快速重命名表?

换句话说,表的大小是否会影响 RENAME 表语句的运行时间。是否还有其他可能导致重命名块显着阻塞的事情?

【问题讨论】:

【参考方案1】:

我相信 MySQL 只需要在存储过程中更改元数据和对表旧名称的引用——表中的记录数应该是无关紧要的。

【讨论】:

【参考方案2】:

除了更改元数据之外,它还会重命名关联的 .FRM 文件。虽然他们可以声称这是一个“原子”操作,但这是 mysql_rename_tables 函数代码中的实际注释......

/* Lets hope this doesn't fail as the result will be messy */

=)

【讨论】:

mysql 5.0.45,sql_rename.cpp,第 81 行。 失败和原子性是不同的东西。失败导致复杂清理的事实——在持有锁的同时——仍然可以是原子的。原子也可能意味着慢。 “原子性是指 DBMS 保证事务的所有任务都已执行或都不执行的能力。”他们通过尝试撤消更改来处理“失败”。从他们的代码注释来看,他们似乎只是希望获得“原子性”。

以上是关于MySQL RENAME TABLE 语句如何工作/执行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MariaDB/MySQL 工作台中获取 SELECT 语句的输出,以“table.column”格式命名列,而不仅仅是“column”?

mysql数据库在已存在表格上增删列,能否用alter table语句实现?

MySQL中利用RENAME TABLE快速高效重命名库(schema)

MySQL-5.5之基础操作练习

我怎么知道我的 MySQL alter table 语句正在工作? [关闭]

我怎么知道我的 MySQL alter table 语句正在工作? [关闭]