#mysql #sql #sql-delete #large-data
#mysql #sql #sql-удалить #большие данные
Вопрос:
я использую базу данных mysql версии 5. У меня есть таблица, в которой около 500.000.000 строк.Таблица освобождает 50 ГБ дискового пространства, если я доверяю phpmyadmin. Мне нравится удалять 90% строк, чтобы освободить место на диске.
Каков наилучший вариант?
-
Я могу удалить строки с помощью скрипта и запустить «ОПТИМИЗИРОВАТЬ ТАБЛИЦУ». Таблица будет заблокирована, но я не знаю, сколько времени это может занять? У кого-нибудь есть опыт?
-
Я могу удалить таблицу, создать новую и импортировать 10% вручную. Сколько времени займет удаление таблицы при таком размере?
Спасибо!
Ответ №1:
Поскольку вы хотите удалить большую часть строк в таблице, я бы рекомендовал переместить строки, которые вы хотите сохранить, во временную таблицу, обрезать таблицу, а затем повторно импортировать. Это по-прежнему требует простоя таблицы (то есть не должно быть операций чтения или записи в таблицу во время выполнения операции), но должно быть на порядок быстрее, чем удаление строки за строкой.
create table tmptable as select * from mytable where ...;
truncate table mytable;
insert into mytable select * from tmptable;
drop table tmptable;
Неявно truncate table
удаляет и воссоздает таблицу, которая освободит место. В документации есть несколько интересных пунктов в отношении вашего вопроса, таких как:
Операции усечения удаляют и заново создают таблицу, что намного быстрее, чем удаление строк по одной, особенно для больших таблиц.
Комментарии:
1. Можете ли вы оценить, сколько времени займет процесс «усечения» без каких-либо вставок? Мне нужно сообщить пользователям о времени простоя.
2.
truncate
должно быть очень быстрым (это операция DDL под капотом, она отбрасывает и воссоздает таблицу).3. И «удаление» удаления файла объемом 50 ГБ с диска? Занимает всего несколько минут?
Ответ №2:
самый быстрый способ
- чтобы скопировать нужные файлы в временную таблицу.
- УСЕЧЕНИЕ ТАБЛИЦЫ
- скопируйте их обратно из временной таблицы