За последние 24 часа нас посетил 21941 программист и 1103 робота. Сейчас ищут 696 программистов ...

Удаление записей из большой базы

Тема в разделе "MySQL", создана пользователем pr0n1x, 27 авг 2018.

  1. pr0n1x

    pr0n1x Активный пользователь

    С нами с:
    30 мар 2006
    Сообщения:
    486
    Симпатии:
    2
    Адрес:
    Киев
    Здравствуйте, поступило от работодателя следующее задание:

    В таблице MySQL (InnoDb) хранится 50 миллионов записей логов. Каждая запись имеет проиндексированное время создания (created_at). Новые записи в таблицу добавляются в режиме реального времени, круглосуточно, примерно 100 записей в минуту.

    Необходимо:
    Удалить из таблицы логов все записи, старше одного месяца.
    В качестве решения задачи пришлите краткое описание вашего подхода и ключевые запросы.

    =================

    Это задача решается одним запросом:
    Код (Text):
    1. DELETE FROM table WHERE created_at < 'date';
    В чем тут подвох?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    а ты попробуй

    это реальная проблема или теоретическая? ибо если реальная, то имеет смысл уходить от мускула.
     
  3. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Т.е. просто смена на PostgreSQL изменит скорость удаления? Или это вы имеете ввиду с тюнингом?
     
  4. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Если записи строками типа '24/May/2018:22:37', как их сравнивать?
     
    #4 keren, 27 авг 2018
    Последнее редактирование: 27 авг 2018
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    в этом плане они не отличаются. Менять надо на что-то, заточенное по хранение логов.
     
    виталий032 нравится это.
  6. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    Видимо, подвох в том, что:
    1) эта таблица постоянно используется, и нельзя чтобы она была надолго заблокирована для каких либо операций
    2) DELETE операция медленная, ибо происходит удаление каждой отдельной записи, попавшей под условие. если их миллионы, то будут миллионы отдельных удалений, на уровне движка мускула.

    я вижу несколько вариантов решения.
    1) запускать периодически скрипт, в котором удалять небольшими частями. например по несколько(десятков) тысяч записей за раз.
    2) использовать партиционирование таблицы. например сделать хеш партицию на основе дня. (или недели). тогда при удалении, мы будем использовать запрос удаления нужных нам партиций целиком, а не отдельных записей таблицы. это несравнимо быстрее.

    ну и незабываем про фрагментацию. OPTIMIZE TABLE , в помощь
     
    mahmuzar нравится это.
  7. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    А, если, отключить сервер, создать временную таблицу, перенести в неё записи за последний месяц (100 запросов/мин. ~ 4,5МЛН записей), а старую таблицу дропнуть
     
    runcore нравится это.
  8. pr0n1x

    pr0n1x Активный пользователь

    С нами с:
    30 мар 2006
    Сообщения:
    486
    Симпатии:
    2
    Адрес:
    Киев
    Всем спасибо, наиболее подходящий вариант это действительно разделение на партиции, спасибо runcore