我有一个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)
我不能给你逐个打击(功能请求#34354会有所帮助,除了它可能不会被反向移植到MySQL 5.0),但额外的时间是因为ALTER ... CHANGE
可能会改变列的类型(以及列属性,如果有的话),这需要转换存储在列中的值和其他检查.MySQL 5.0不包括新类型和属性与旧版本相同的优化.从ALTER
MySQL 5.0下的文档:
在大多数情况下,ALTER TABLE通过制作原始表的临时副本来工作.对副本执行更改,然后删除原始表并重命名新表.在执行ALTER TABLE时,原始表可由其他会话读取.对表的更新和写入将停止,直到新表准备就绪,然后自动重定向到新表,而不会有任何失败的更新.
[...]
如果对RENAME以外的ALTER TABLE使用任何选项,MySQL总是会创建一个临时表,即使数据不需要严格复制(例如更改列的名称时).
在5.1下,ALTER
还有一些额外的优化:
在某些情况下,不需要临时表:
通过更改表的.frm文件而不是触摸表内容,可以立即修改仅修改表元数据而不是表数据的更改.以下更改是可以通过这种方式进行的快速更改:
重命名列,InnoDB存储引擎除外.
[...]
因为MySQL会在您进行架构更改时重建整个表.
这样做是因为它是在某些情况下执行此操作的唯一方法,并且无论如何它使服务器更容易重建它.