Я использую таблицу MySQL для регистрации пользовательских данных (1000 новых строк в минуту). Как я могу повернуть строки через 2 дня?

#mysql #database #database-design #innodb

#mysql #База данных #database-design #innodb

Вопрос:

Чтобы привести вам пример, скажем, у меня есть сайт, где пользователи могут добавлять неограниченное количество заданий cron (частота 1 сек), и я регистрирую результаты каждого задания в таблице Mysql.

Теперь, поскольку у меня нет неограниченного хранилища (а также потому, что я не хочу, чтобы моя таблица становилась огромной) Я хочу ограничить историю журналов только 30 днями.

Ранее в более старой версии Mysql я запускал DELETE FROM logs where created_at < DATE_SUB(NOW(), INTERVAL 30 DAY) , чтобы очистить свою таблицу, но это приводит к частому сбою и повреждению моих таблиц. Это также блокирует мою таблицу во время DELETE , что делает сайт очень медленным.

В любом случае, как я могу реализовать вращение строк (например, вращение журнала) для моей таблицы Mysql или строк? Удаление строк — мой единственный вариант или есть какой-то другой вариант?

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

1. Задание Cron выполняется каждую секунду? И пользователь может поместить в нее все, что захочет? Это само по себе звучит как катастрофа, ожидающая своего часа.

2. Перейдите с MyISAM на InnoDB; это должно устранить повреждение.

Ответ №1:

Вы могли бы использовать раздел базы данных

https://dev.mysql.com/doc/refman/5.7/en/partitioning-types.html

Пример

 PARTITION BY HASH( MONTH(column) )
  

Это дает 7 разделов. Затем вы можете просто

 ALTER TABLE t1 TRUNCATE PARTITION p0;
  

Чтобы удалить один раздел.

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

1. Привет, как я буду удалять журналы старше 30 дней с помощью этого? После просмотра связанной страницы, я думаю, я могу сделать это: CREATE TABLE logs (...) PARTITION BY HASH( MONTH(created_at) ) а затем отбросить предыдущий месяц?

2. Да, это правильно. Просто разделите bu на те значения, которые вы хотите быстро удалить

3. Также хотел бы отметить, что если вы отбросите транзакции за месяцы 2-го числа, у вас будут данные только за 2 дня. Возможно, вам потребуется поддерживать этот процесс в течение 2 месяцев. Вы могли бы выполнять еженедельные операции и хранить данные до 5 недель, чтобы у вас было 30 дней

4. BY HASH не будет выполнять обрезку разделов, поэтому это неэффективно.

5. @RickJames не могли бы вы, пожалуйста, уточнить это? Сможет ли он вставлять 1000 строк в минуту? Был бы признателен, если есть что-нибудь, о чем я должен знать, прежде чем приступить к реализации этого .. спасибо!

Ответ №2:

Здесь обсуждается использование PARTITION BY RANGE как очень эффективный способ «удаления» старых данных. В нем объясняется, как это сделать DROP PARTITION (что более эффективно, чем TRUNCATE ) и создавать новый раздел каждый день или неделю.