Эффективное удаление больших объемов (4 миллиона строк) данных mysql на очень регулярной основе

10

У нас есть таблица MySQL, которая в любой момент времени имеет около 12 миллионов строк. Нам нужно удалить старые данные, чтобы размер таблицы был несколько управляемым.

Сейчас мы выполняем этот запрос ежедневно, в полночь, используя задание cron:

DELETE FROM table WHERE endTime < '1393632001'

В последний раз, когда запрос выполнялся, он исследовал 4 602 400, занял более 3 минут, и процессор прошел через крышу.

Процессор работает в полночь

Что мы можем сделать, чтобы не допустить необоснованного всплеска ЦП, синхронных соединений БД, глубины дискового метки и т. Д., В то же время удаляя старые данные?

PS: вы заметите, что запрос на самом деле происходит в довольно неподходящее время в нашем цикле использования. Предположим, что мы уже сместили время запроса, чтобы оно выполнялось при самой низкой точке использования каждый день. Кроме того, в endTime нет индекса, и я бы предпочел сохранить его таким, если это возможно, потому что тонна данных вставляется очень регулярно, а поиск невелик.


источник
возможно, используйте задания cron для удаления каждые 10 минут и 100 тысяч за раунд или каждые 5 минут 50 тысяч за раунд
меньшие куски на более регулярной основе?
хорошо, но кажется, что это может просто подорвать наш пользовательский опыт в течение более длительных периодов времени :) что-нибудь, что мы можем сделать запрос / дизайн мудрый?
1
186k пользователей, нет выделенного дБ парня?
1
Вы получите лучшие ответы на "Администраторы базы данных"
Джеймс Андерсон

Ответы:

13

Решением вашей проблемы является возможность MySQL под названием «разбиение». Документация здесь .

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

Вы будете хранить ценность дня endTimeв каждом разделе. Тогда шагом удаления будет усечение раздела, а не удаление группы строк в большой таблице. Усечение раздела будет намного более быстрым методом.

Гордон Линофф
источник
вау, это было невероятно полезно, и кажется идеальным решением. Время читать о разделах! Спасибо!
Хотя разбиение может быть хорошим решением, остерегайтесь накладных расходов - оно может значительно замедлить ваши запросы. К тому же усеченная таблица тоже не мгновенная. Я бы рассмотрел pt-archiver. Вы можете решить свои проблемы с шипами и сохранить ваш стол таким же простым, как сейчас
akuzminsky