2010-07-11 4 views
3

У меня в настоящее время таблица MySQL около 20 миллионов строк, и мне нужно ее обрезать. Я хотел бы удалить каждую строку, у которой updateTime (временная метка ввода) было более одного месяцаКак быстро обрезать большие столы?

назад. Я лично не выполнял никаких изменений в порядке таблицы, поэтому данные должны быть в том порядке, в котором они были вставлены, и есть ключ UNIQUE в двух полях: id и updateTime. Как мне это сделать за короткий промежуток времени?

ответ

12

Сколько времени на провал вы можете понести? Насколько велики строки? Сколько вы удаляете?

Проще говоря, удаление строк - одна из самых дорогих вещей, которые вы можете сделать с таблицей. Это просто ужасно.

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

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

В противном случае вы в значительной степени застреваете с хорошим удалением.

12

Существует два способа удалить большое количество строк. Во-первых есть очевидный способ:

DELETE FROM table1 WHERE updateTime < NOW() - interval 1 month; 

Второй (немного сложнее) способ создать новую таблицу и скопировать данные, которые вы хотите сохранить, укоротить свою старую таблицу, а затем скопировать строки обратно.

CREATE TABLE table2 AS 
SELECT * FROM table1 WHERE updateTime >= NOW() - interval 1 month; 

TRUNCATE table1; 

INSERT INTO table1 
SELECT * FROM table2; 

Использование TRUNCATE гораздо быстрее, чем DELETE с пунктом WHERE, когда у вас есть большое количество строк для удаления и относительно небольшое число, которое вы хотите сохранить.

+0

Я попробовал это с таблицей, содержащей 3,7 миллиона строк. Мне пришлось удалять 200 тыс. Строк. Путь TRUNCATE был быстрее. (Я устал ждать традиционного DELETE примерно через 10 минут, а другой путь занял около 3 минут). Я использовал ВРЕМЕННУЮ таблицу – Agustin

+0

, это хороший материал! отличный способ сократить время резервного копирования + восстановление –

0

Разделение удалений с ограничением может ускорить процесс;

Мне пришлось удалить строки 10M, и я выпустил команду. Он не отвечал часами.

Я убил запрос (который взял пару часов)

затем Разделить удаления.

DELETE from table where id > XXXX limit 10000; 
DELETE from table where id > XXXX limit 10000; 
DELETE from table where id > XXXX limit 10000; 
DELETE from table where id > XXXX limit 10000; 

Затем я продублировал этот оператор в файле и использовал эту команду.

mysql> source /tmp/delete.sql 

Это было намного быстрее.

Вы также можете попробовать использовать инструменты, такие как pt-tools. и pt-архиватор.

0

Фактически, даже если вы не можете долгое время отключать таблицу в автономном режиме, вы можете использовать технику «переименовать таблицу», чтобы избавиться от старых данных.

Остановить процессы, накладывая на стол.

rename table tableName to tmpTableName; 
create table tableName like tmpTableName; 
set @currentId=(select max(id) from tmpTableName); 
set @[email protected]+1; 
set @indexQuery = CONCAT("alter table test auto_increment = ", @currentId); 
prepare stmt from @indexQuery; 
execute stmt; 
deallocate prepare stmt; 

Начальные процессы, накладывающие на стол.

insert into tableName 
select * from tmpTableName; 
drop table; 

Новые вставки в tableName начинаются с правильного индекса; Старые данные будут вставлены в правильные индексы.

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

  • Нет связанных вопросов^_^