У нас есть таблица MySQL, которая в любой момент времени имеет около 12 миллионов строк. Нам нужно удалить старые данные, чтобы размер таблицы был несколько управляемым.
Сейчас мы выполняем этот запрос ежедневно, в полночь, используя задание cron:
DELETE FROM table WHERE endTime < '1393632001'
В последний раз, когда запрос выполнялся, он исследовал 4 602 400, занял более 3 минут, и процессор прошел через крышу.
Что мы можем сделать, чтобы не допустить необоснованного всплеска ЦП, синхронных соединений БД, глубины дискового метки и т. Д., В то же время удаляя старые данные?
PS: вы заметите, что запрос на самом деле происходит в довольно неподходящее время в нашем цикле использования. Предположим, что мы уже сместили время запроса, чтобы оно выполнялось при самой низкой точке использования каждый день. Кроме того, в endTime нет индекса, и я бы предпочел сохранить его таким, если это возможно, потому что тонна данных вставляется очень регулярно, а поиск невелик.