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