为什么在mysql中重命名列需要这么长时间?

时间:2010-01-18 12:57:04

标签: mysql

我有一个12 GB的表格,我正在尝试重命名保存数据的blob列,这是永远的。有人可以通过吹嘘为什么要重命名专栏这么长时间给我一个打击?我会认为这个操作会非常快,无论表的大小如何?

编辑:我运行的查询如下

 alter table `rails_production`.`pictures` change `data` `image_file_data` mediumblob NULL

似乎大部分时间都花在等待mysql制作图片表的临时副本上,因为它非常大,需要一段时间才能完成。

它是在要做的事情列表中,将图片存储从数据库更改为文件系统。

EDIT2:Mysql Server版本:5.0.51a-24 + lenny2(Debian)

3 个答案:

答案 0 :(得分:10)

我不能给你逐个打击(功能请求#34354会有所帮助,除了它可能不会被反向移植到MySQL 5.0),但额外的时间是由于事实上ALTER ... CHANGE可能会更改列的类型(以及列属性,如果有的话),这需要转换存储在列中的值和其他检查。 MySQL 5.0不包括新类型和属性与旧版本相同的优化。来自MySQL 5.0下的ALTER文档:

  

在大多数情况下,ALTER TABLE通过制作原始表的临时副本来工作。对副本执行更改,然后删除原始表并重命名新表。在执行ALTER TABLE时,原始表可由其他会话读取。对表的更新和写入将停止,直到新表准备就绪,然后自动重定向到新表,而不会有任何失败的更新。

     

[...]

     

如果对RENAME之外的ALTER TABLE使用任何选项,MySQL总是会创建一个临时表,即使数据不需要严格复制(例如更改列的名称)。

在5.1下,ALTER还有一些额外的优化:

  

在某些情况下,不需要临时表:

     
      
  • 通过更改表的.frm文件而不触及表内容,可以立即修改只修改表元数据而不修改表数据的更改。以下更改是可以通过这种方式进行的快速更改:

         
        
    • 重命名一个列,除了InnoDB存储引擎
    •   
  •   
     

[...]

答案 1 :(得分:7)

因为MySQL会在您进行架构更改时重建整个表。

这样做是因为它是在某些情况下执行此操作的唯一方法,并且它使服务器更容易重建它。

答案 2 :(得分:2)

是的mysql做了表的临时副本。我不认为有一个简单的方法。您应该考虑将图片存储在文件系统中,并仅在mysql中存储路径。我猜这是加强它的唯一方法。