#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
) и создавать новый раздел каждый день или неделю.