2010-01-18 208 views
13

我有一張12 GB的圖片,我試圖重命名包含數據的blob列,並且它將永久佔用。爲什麼需要花費這麼長的時間來重新命名這個專欄?有人可以給我一個打擊嗎?無論表格的大小,我都會認爲這個操作非常快。爲什麼在mysql中重命名列需要很長時間?

編輯:我跑的查詢如下

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

看來,大部分的時間都花在等待的mysql使照片表,因爲它是非常大的一個臨時副本正在一段時間去做。

它是要做的事情,將圖片存儲從數據庫更改爲文件系統。

EDIT2:MySQL服務器版本:5.0.51a-24 + lenny2(Debian的)

+1

可能是一個好主意後你跑的精確查詢。 – nos

+1

也許這就是爲什麼我見過的關於如何將圖像存儲在數據庫中的問題*通常會說'將圖像存儲在文件系統中並鏈接到數據庫中的圖像。 – pavium

+0

@Janak:你使用的是什麼版本的MySQL? – outis

回答

10

我不能給你一擊(功能請求#34354會有幫助,除了它可能不會被移植到MySQL 5.0),但額外的時間是由於ALTER ... CHANGE可能會更改列的類型(以及列屬性,如果有),這需要轉換存儲在列中的值和其他檢查。當新的類型和屬性與舊的相同時,MySQL 5.0不包括優化。從MySQL 5.0下的ALTER文檔:

在大多數情況下,ALTER TABLE通過創建原始表的臨時副本來工作。對副本執行更改,然後刪除原始表,並重命名新表。 ALTER TABLE正在執行時,原始表可供其他會話讀取。對錶進行更新和寫入操作會停止,直到新表準備就緒,然後自動重定向到新表而不會有任何失敗的更新。

[...]

如果你使用任何選項ALTER比RENAME其他表時,MySQL通常會創建一個臨時表,即使數據不嚴格地需要被複制(當您更改,如一列的名稱)。

在5.1,ALTER有一些額外的優化:

在一些情況下,沒有臨時表是必要的:

  • 改變對於僅修改表的元數據,而不是表的數據可以是立即通過改變表格的.frm文件並且不觸及表格內容。下面的變化是快速的改變可以做出這樣:

    • 重命名列,除了InnoDB存儲引擎

[...]

+6

重命名一個列,InnoDB存儲引擎除外。 :( – pjb3

+0

好點pjb3。不知道它是否從原來的帖子發生了變化,但我編輯了答案以反映MySQL文檔。正如你所說,這種技術似乎不支持innodb。 – DougW

+0

我意識到你發佈了這個答案早在2010年,但自此之後,MySQL 5.6增加了很多新的情況,可以在原地進行ALTER。請參閱http://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl。 HTML –

7

因爲MySQL將重建整個表,當你進行架構更改。

這樣做是因爲它是在某些情況下執行此操作的唯一方式,並且它使服務器無論如何都可以輕鬆地重建它。

2

是的,mysql執行表的臨時副本。我不認爲有一個簡單的方法。你應該真的考慮將這些圖片存儲在文件系統中,並且只在mysql中存儲路徑。我想這是唯一能夠把它固定起來的方法。

相關問題