我有一个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)
答案 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中存储路径。我猜这是加强它的唯一方法。