2010-01-18 2 views
13

У меня есть таблица размером 12 ГБ, полная изображений, я пытаюсь переименовать столбец blob, который хранит данные, и он берет навсегда. Может ли кто-нибудь дать мне удар от удара, почему он так долго переименовывает колонку? Я бы подумал, что эта операция будет довольно быстрой, независимо от размера стола?Почему требуется переименование столбца в mysql?

EDIT: запрос я побежал следующим

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 не включает оптимизацию, когда новый тип и атрибуты такие же, как и старые. Из документации по ALTER по MySQL 5.0:

В большинстве случаев ALTER TABLE работает, создавая временную копию исходной таблицы. Изменение выполняется на копии, а затем исходная таблица удаляется, а новая - переименовывается. Пока выполняется ALTER TABLE, исходная таблица может быть прочитана другими сеансами. Обновления и записи в таблицу останавливаются до тех пор, пока новая таблица не будет готова, а затем автоматически перенаправляются в новую таблицу без каких-либо неудачных обновлений.

[...]

Если вы используете какой-либо опции для ALTER TABLE кроме 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. Думаю, это единственный способ закрепить его.

Смежные вопросы