Здравствуйте, поступило от работодателя следующее задание: В таблице MySQL (InnoDb) хранится 50 миллионов записей логов. Каждая запись имеет проиндексированное время создания (created_at). Новые записи в таблицу добавляются в режиме реального времени, круглосуточно, примерно 100 записей в минуту. Необходимо: Удалить из таблицы логов все записи, старше одного месяца. В качестве решения задачи пришлите краткое описание вашего подхода и ключевые запросы. ================= Это задача решается одним запросом: Код (Text): DELETE FROM table WHERE created_at < 'date'; В чем тут подвох?
а ты попробуй это реальная проблема или теоретическая? ибо если реальная, то имеет смысл уходить от мускула.
Видимо, подвох в том, что: 1) эта таблица постоянно используется, и нельзя чтобы она была надолго заблокирована для каких либо операций 2) DELETE операция медленная, ибо происходит удаление каждой отдельной записи, попавшей под условие. если их миллионы, то будут миллионы отдельных удалений, на уровне движка мускула. я вижу несколько вариантов решения. 1) запускать периодически скрипт, в котором удалять небольшими частями. например по несколько(десятков) тысяч записей за раз. 2) использовать партиционирование таблицы. например сделать хеш партицию на основе дня. (или недели). тогда при удалении, мы будем использовать запрос удаления нужных нам партиций целиком, а не отдельных записей таблицы. это несравнимо быстрее. ну и незабываем про фрагментацию. OPTIMIZE TABLE , в помощь
А, если, отключить сервер, создать временную таблицу, перенести в неё записи за последний месяц (100 запросов/мин. ~ 4,5МЛН записей), а старую таблицу дропнуть