На днях у меня возникла задача добавить в таблицу новое поле.
Казалось бы, 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
-
Рассматривается Обучение Веб-Дизайну Дома
19 Oct, 24 -
О Выборе Конфигурации Пк
19 Oct, 24 -
Баги Из Ссср
19 Oct, 24 -
Контекстная Реклама Внедрена В Pdf
19 Oct, 24