Как динамически разделить таблицу по дате?

#mysql #partitioning

#mysql #разбиение

Вопрос:

В настоящее время у меня есть таблица с примерно 4 миллионами строк, но я хотел бы сохранить только данные за последние три месяца в последнем разделе, когда этим данным исполнится 91 день, их следует удалить из этого раздела и отправить в другой раздел или таблицу.

Например,

  1. Раздел 0: просто сохраните данные за последние три месяца в этом разделе (сохраните все текущие данные, где DateOrder DATE_DIFF (NOW() — ИНТЕРВАЛ 3 МЕСЯЦА, NOW()) )
  2. Раздел 1: остальные данные из таблицы (сохраните все данные, которым более 3 месяцев от текущей временной метки. ( DateOrder < NOW() — ИНТЕРВАЛ 3 МЕСЯЦА)
 CREATE TABLE LargeTable  
(
    id INT NOT NULL AUTO_INCREMENT
,   CustomerName    VARCHAR(100)
,   CustomerEmail   VARCHAR(50)
,   DateOrder       DATETIME NULL
,   PRIMARY KEY (id)
);
 

Комментарии:

1. Ни за что. Просто переместите строки полностью старого раздела в архивную таблицу, затем удалите этот раздел, а затем создайте новый раздел на будущий период. Выполняйте это каждый квартал из процедуры события. Ваша таблица, наконец, будет содержать строки, которым где-то не более 91-120 дней.

Ответ №1:

Я бы использовал PARTITION BY RANGE(TO_DAYS(DateOrder)) и использовал еженедельные разделы. Это будет около 15 разделов, что является хорошим балансом между скоростью и пространством.

Гораздо больше конкретных деталей для таких случаев содержится в http://mysql.rjweb.org/doc.php/partitionmaint

300 Тыс. строк — это не так много; DROP PARTITION это будет довольно быстро раз в неделю.

Наверняка есть другие столбцы и / или индексы?