Задать вопрос

Как устранить тормоза таблицы после большого delete?

Здравствуйте!

Имеется таблица со следующей структурой (ненужные поля я не указал):
CREATE TABLE `logs` (
  `INSERT_DATE` datetime DEFAULT NULL,
  `DATA` text NOT NULL,
  KEY `INSERT_DATE` (`INSERT_DATE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


В неё вставляются данные, около 1 кб на строчку. INSERT_DATE заполняется через «now()»
В день новых данных поступает около 15 млн записей. Утром следующего дня забираются данные за вчерашний день в другое приложение по сети

SELECT INSERT_DATE, DATA from logs WHERE INSERT_DATE >= '2015-04-16' AND INSERT_DATE < '2015-04-17'


затем выполняется запрос вида, данные удаляются
DELETE FROM logs WHERE INSERT_DATE >= '2015-04-16' AND INSERT_DATE < '2015-04-17'


Без этого запроса всё прекрасно и если его не выполнять, табличка продолжает быстро вставлять около 200 запросов в секунду и спокойно дорастает до 50 млн, например.

Однако, если данные за предыдущий день удалить, то вставка начинает

Но после этого запроса вставка начинает тормозить, соединения накапливаются, приходится делать
optimize table logs;
который выполняется длительное время, таблица простаивает.

Есть мысль что проблема в фрагментации и перестроении индекса после многих вставок/удаления.
Куда можно смотреть для решения проблемы?
Заранее спасибо!
  • Вопрос задан
  • 433 просмотра
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
@dredd_krd
Partitions, быстро и просто. Каждый день по скрипту можно добавлять partition на следующий день, а когда нужно удалить какую-нить таблицу - просто дропаешь partition, и остальные данные остаются. Не нужно ни переименовывать таблицы, ни удалять старые. Таблица остается жива и доступна, нет моментов, когда она может быть не доступна (напр., в момент переименования).
Данные по partition-ам распределяются как раз по значению ключа, поэтому проблем не возникнет.
Ответ написан
Перестроение индексов, медленный диск.
Смотреть в сторону переименования старой таблицы, создания пустой новой для новых записей, а потом удаления старой ненужной. Тогда ни переиндексирования, ни долгой работы с диском - красота!
Ответ написан
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Если это логи, то:
a) зачем там индекс?
б) подумать нужно ли хранить сырые данные вообще, или можно сразу агрегировать что то?
Плюсую Леонид Сысолетин , решение с суточной таблицей живое.
Ответ написан
KorroLion
@KorroLion
Для логов можно было бы сделать шардинг по дням. Таблицы: Logs_1, Logs_2, Logs_3 и т.д.
Старые таблицы дропать (это моментально!)
Номером таблицы может быть день недели, день месяца или года.
Ответ написан
Комментировать
@lega
Велосипед, но (т.к. задача простая) можно скидывать в файлы, один день - один файл, будет работать гораздо быстрее (передачу/чтение по сети можно ускорить до х100) + экономия диска и памяти. При желании можно делать сжатие - даст экономию диска и более быструю передачу по сети.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы