Добавление нового столбца в таблицу с 20 миллиононами записей

almerti
Дата: 02.02.2013 16:57:52
Добавляю в таблицу с 20 млн записей tinyint поле - вот жду уже 2 часа, mysql съедает весь процессор, не завис. Добавляю просто через консоль "ALTER TABLE `table` ADD `approved` TINYINT NOT NULL ;"
Может быть есть какие-то особые условия или действия, которые нужно выполнить при добавлении новых столбцов в такие большие таблицы, так как что-то я боюсь, что ничего он в итоге не добавит(слишком уж много времени уже прошло. сервер мощный).
javajdbc
Дата: 02.02.2013 19:37:07
almerti,

тут кто-то говорил что удаление больших таблиц очень медленое так
как по идиотски перестраивается индекс чуть ли не на каждое удаление.
Добавка поля может (только проедположение) состоять из
удаление и перестроения таблицы -- ну и тормоза из-за индексам.

Попробуйте:

1.
-- удалить все индексы,
-- изменить таблицу .
-- пере-создат- индексы

или
2.
-- создать таблицу:
create table new_t as
select *, 1 new_tinyint_column
from old_t
-- переиименовать таблицы
-- пересоздать индексы.
Akina
Дата: 02.02.2013 22:23:35
Достаточно посмотреть, как именно хранятся записи, чтобы понять, что фактически таблица переписывается заново поблочно. А если есть кластерный индекс - то это дикие тормоза от постоянной тасовки блоков. Впрочем, и без него грустно.

javajdbc даёт верный совет - перегнать данные в другую таблицу. Правда, я бы это делал через select into outfile - load from file.

javajdbc
тут кто-то говорил что удаление больших таблиц очень медленое так
как по идиотски перестраивается индекс чуть ли не на каждое удаление.

Удаление не самих таблиц, а данных из таблиц, наверное...
DBConstructor
Дата: 02.02.2013 23:39:04
Интересно, когда люди всё же начнут читать мануалы?

http://dev.mysql.com/doc/refman/5.5/en/alter-table.html
Storage, Performance, and Concurrency Considerations

In most cases, ALTER TABLE makes a temporary copy of the original table. MySQL waits for other operations that are modifying the table, then proceeds. It incorporates the alteration into the copy, deletes the original table, and renames the new one.

...

For MyISAM tables, you can speed up index re-creation (the slowest part of the alteration process) by setting the myisam_sort_buffer_size system variable to a high value.

http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_bulk_insert_buffer_size
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_key_buffer_size
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_autocommit
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_unique_checks
http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_foreign_key_checks
Akina
Дата: 03.02.2013 23:17:06
DBConstructor
Интересно, когда люди всё же начнут читать мануалы?

То, что модифицируется копия, а не оригинал, ни на что не влияет. Изготовление копии - процесс быстрый. Время (и проц) кушает именно модификация.
Кстати, под таблицей может оказаться innodb...
InterSky
Дата: 04.02.2013 17:53:40
При ALTER происходит не "модификация копии" а создание новой таблицы.
Не помню как на линуксах, а в виндоусе в тойже директории где и твоя таблица содаётся новая талица с произвольным именем. Например создаются 3 файла:
#327432.frm
#327432.myd
#327432.myi
изначально нулевого размера и потом увеличивается.
Если ты делал alter table add то этот новый файл буде расти ровно до такого же размера какой у тебя была старая таблица.
Так что не паникуй, просто посмотри физически на размер твоего старого файла и нового, и примерно сможешь сам посчитать через сколько завершится изменение твоей таблицы.
Как только alter выполнится, старая таблица удалится, а новые файлы будут переименованы в название старой таблицы.

При модификации больших таблиц (у меня они около 8Гб) действительно больше всего времени уходит на индексы. Так что я вначале удаляю индексы, потом модифицирую таблицу, потом создаю индекс...
almerti
Дата: 04.02.2013 19:24:22
всем спасибо за ответы. всё стало куда яснее