Какой самый быстрый способ удалить миллионы строк из базы данных MySQL? - PullRequest
0 голосов
/ 18 февраля 2019

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

Я попытался использовать стандартный подход:

DELETE FROM table WHERE date >= '2017-01-01' AND date <= '2017-12-31'

Но это, очевидно, занимает слишком много времени, потому чтоЕсть более 7 миллионов строк для удаления.Есть ли способ ускорить это?Я пытаюсь разделить на месяцы и даже меньшие порции, но после запуска кода в течение некоторого времени я отключаюсь от сервера.

Заранее спасибо.

РЕДАКТИРОВАТЬ:

CREATE TABLE table (

  id INT(11) NOT NULL AUTO_INCREMENT,
  date DATE DEFAULT NULL,
  # 18 more columns

  PRIMARY KEY (id)
)
ENGINE = INNODB,
AUTO_INCREMENT = 29616055,
AVG_ROW_LENGTH = 317,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_general_ci;

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019
  1. Создать пустую копию таблицы (ключи и все).
  2. INSERT ... ВЫБЕРИТЕ данные, которые вы хотите сохранить, из оригинала в копию.
  3. Удалите все ограничения внешнего ключа, относящиеся к исходной таблице.
  4. УДАЛИТЕ исходную таблицу.
  5. ПЕРЕИМЕНОВАТЬ копию на имя оригинала.
  6. Воссоздать все внешние ключи, пропущенные на шаге 3.
0 голосов
/ 18 февраля 2019

Если у вас достаточно места, создайте временную таблицу и перезагрузите исходную таблицу:

create table temp_t as
    select *
    from table
    where date >= '2018-01-01';

truncate table t;

insert into t
     select *
     from temp_t;

Это сэкономит все накладные расходы на журналирование для delete - и это может быть довольно дорого.

Далее вам нужно узнать о разделах.Это делает процесс намного проще.Вы можете просто удалить раздел вместо удаления строк - и для удаления раздела нет построчного ведения журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...