为什么在mysql中重命名一个列需要这么长时间?
我有一个12GB的表格,里面满是图片,我试图重命名保存数据的blob列,这要花很长时间。有人能告诉我为什么要花这么长时间来重新命名这个专栏吗?我原以为不管桌子有多大,这个手术都会很快完成 编辑:我运行的查询如下为什么在mysql中重命名一个列需要这么长时间?,mysql,Mysql,我有一个12GB的表格,里面满是图片,我试图重命名保存数据的blob列,这要花很长时间。有人能告诉我为什么要花这么长时间来重新命名这个专栏吗?我原以为不管桌子有多大,这个手术都会很快完成 编辑:我运行的查询如下 alter table `rails_production`.`pictures` change `data` `image_file_data` mediumblob NULL 似乎大部分时间都花在等待mysql创建pictures表的临时副本上,因为它非常大,所以需要花费一段时间
alter table `rails_production`.`pictures` change `data` `image_file_data` mediumblob NULL
似乎大部分时间都花在等待mysql创建pictures表的临时副本上,因为它非常大,所以需要花费一段时间才能完成
将图片存储从数据库更改为文件系统是需要做的事情之一
EDIT2:Mysql服务器版本:5.0.51a-24+lenny2(Debian),因为当您更改架构时,Mysql将重建整个表
之所以这样做,是因为在某些情况下,这是唯一的方法,而且它使服务器更容易重建它。是的,mysql会临时复制表。我不认为有一个简单的方法来解决这个问题。您应该真正考虑将图片存储在文件系统上,并且只在mysql中存储路径。我想,这是加快速度的唯一方法。我不能给你一个详细的说明(功能请求会有所帮助,只是它可能不会被移植到MySQL 5.0),但额外的时间是由于一个
更改。。。更改
可能会更改列的类型(以及列属性,如果有),这需要转换存储在列中的值和其他检查。MySQL 5.0不包括对新类型和属性与旧类型和属性相同时的优化。从MySQL 5.0下的文档:
在大多数情况下,ALTERTABLE通过制作原始表的临时副本来工作。对副本执行更改,然后删除原始表并重命名新表。在执行ALTERTABLE时,其他会话可以读取原始表。在新表准备就绪之前,暂停对表的更新和写入,然后自动重定向到新表,而不进行任何失败的更新
[……]
如果您使用除重命名以外的任何选项来更改表,MySQL总是会创建一个临时表,即使数据不需要严格复制(例如更改列名时)
在5.1中,有一些额外的优化:
在某些情况下,不需要临时表:
- 只修改表元数据而不修改表数据的更改可以通过更改表的.frm文件而不接触表内容立即进行。以下更改是可以通过这种方式进行的快速更改:
- 重命名列,InnoDB存储引擎除外
发布您运行的确切查询可能是一个好主意。也许这就是为什么我看到的关于如何在数据库中存储图像的问题通常会说“将图像存储在文件系统中,并将图像链接到数据库中”。@Janak:您使用的是什么版本的MySQL?重命名列,InnoDB存储引擎除外:(好的观点是pjb3。我不确定它是否在最初发布后发生了更改,但我编辑了答案以反映MySQL文档。正如你所说,innodb似乎不支持这种技术。我知道你在2010年发布了这个答案,但从那以后,MySQL 5.6添加了许多新的案例,可以就地更改。请参阅