Большие Таблицы И Уникальные Ключи

На днях у меня возникла задача добавить в таблицу новое поле.

Казалось бы, ALTER TABLE. Но это было не так.

Я запускал этот запрос вечером, но утром он еще работал (16 часов не хватило :) Я сразу предположил, что проблема скорее всего в построении уникального индекса и огромном размере исходной таблицы.

Как известно, с помощью ALTER TABLE сервер создает временный файл, в который копирует необходимые данные.

SHOW PROCESSLIST подтвердил это.

Дам более подробную формулировку проблемы.

Данный.

Есть таблица данных.

Тип - MyISAM. В таблице есть поле VARCHAR длиной 140 символов и уникальный ключ для него.

Таблица содержит около 150 миллионов строк.

Емкость диска: 15 ГБ.

Необходимый добавить новое поле в таблицу.

Поиск показал, что это известная проблема и что обычный метод может занять вечность.

Размер индекса не позволяет использовать кэш в памяти, поэтому создание новой таблицы построчно происходит очень медленно.

В Блог Петра Зайцева было предложено нестандартное «хакерское» решение.

1. Создать новую таблицу (например, test_new) с нужной структурой, но без каких-либо индексов, даже без первичного ключа; если есть поле с автоинкрементом, удалите auto_increment из его определения.

2. Заполните эту таблицу данными, используя ВСТАВИТЬ В test_new… ВЫБРАТЬ .

3. Создайте еще одну таблицу с той же структурой, что и test_new, но со всеми необходимыми ключами ; Назовем это test_struct. 4. Перейдите в каталог на диске, где хранятся наши таблицы, и скопируйте test_struct.frm поверх test_new.frm и test_struct.MYI поверх test_new.MYI. 5. Откройте клиент mysql и выполните запросы FLUSH TABLES и REPAIR TABLE test_new. В моем случае РЕМОНТ ТАБЛИЦЫ занял 20 минут. Возможная проблема.

Я также столкнулся с нехваткой места во временном каталоге MySQL. В моем случае это был /tmp емкостью 5 ГБ.

Дело в том, что REPAIR TABLE создает временный файл для нового индекса, который в итоге весил 7 ГБ, что, конечно, не умещалось в 5 ГБ.

Если на диске недостаточно места, MySQL ждет 1 минуту, а затем пытается найти его снова, и так много раз.

Мы, конечно, остаёмся в неведении, думая, что он занят :) Вы можете установить временный каталог MySQL с помощью параметра tmpdir .

Где я могу использовать этот хак? При добавлении, удалении или изменении поля в очень большой таблице, где есть уникальный индекс, тоже очень большой (скорее всего, на строковом поле).

При создании уникального индекса для такой таблицы.

При воссоздании такой таблицы из дампа.

Добавление.

В чем секрет? Обычное создание уникального индекса происходит построчно, запись за записью.

REPAIR TABLE сразу создает индекс с помощью сортировки, что происходит значительно быстрее.

Удачи! Теги: #MySQL #Уникальный ключ #изменить таблицу #MySQL

Вместе с данным постом часто просматривают: