LINUX.ORG.RU
ФорумAdmin

Есть ли способ дефрагментировать MySQL-таблицу типа MEMORY?

 , , ,


1

1

Задача — нужно вести Web-логи. Не много, фактически — учёт посещений всеми пользователями всех ресурсов за 10-20 минут. На моих проектах это порядка (максимум) тысяч-десятков тысяч записей, каждая суммарной длиной в десяток-другой килобайт. Хранить нужно много разной информации и делать сложные выборки. Так что лучше MySQL ничего не придумал.

Проблема. На высокой активности MySQL какого-то фига начинает сильно грузить IO. Ладно, хранить данные всё равно не надо, делаю ENGINE=MEMORY. Отлично, IO резко падает, всё красиво.

Проблема №2. Поскольку таблица постоянно чистится, накапливается высокий уровень фрагментации. И вот тут — опа. Таблицы Memory не оптимайзятся. Уровень мусора постоянно растёт, пока размер таблицы не превысит tmp_table_size/max_heap_table_size, после чего начинают лететь ошибки «table is full». Фигня выходит, реальных данных в таблице едва несколько десятков мегабайт, а жрёт она пол-гига в памяти.

Как её оптимизировать? Есть идеи?

Есть, конечно, вариант, типа раз в час тупо грохать все данные, они не настолько критичны. Но криво.

Другой вариант — пересоздавать таблицу, делая новую временную из старой, потом грохать старую и создавать её заново. Мало того, что некрасиво, так ещё придётся вводить в систему блокировку использования логов, чтобы не сыпались ошибки, пока пересоздаётся таблица.

Какие ещё есть варианты?

Или, может, что-то вместо MySQL применить? Нужно хранить по каждому обращению несколько данных (строковых, целочисленных, с плавающей точкой), делать очень частое получение суммы по одному из параметров (суммарная загрузка — для выдачи 503 ошибки чрезмерно активным ботам и качальщикам) и периодические группировки по ряду параметров (изучение активности по классам/категориям объектов сайта и посетителей).

★★★★★

Последнее исправление: Klymedy (всего исправлений: 1)

Ответ на: комментарий от leave

ALTER TABLE ENGINE=MEMORY

Ага, спасибо, работает :)

А что до R/O и редкого обновления — так они в таком виде совершенно бесполезны. Тут любой другой движок отлично будет работать, данные в кеше ОС будут.

Как раз MEMORY, что я многократно наблюдаю, используют там, где нужно активно модифицировать данные.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Ага, спасибо, работает :)

я когда-то очччень долго искал эту строчку в мануале :)

leave ★★★★★
()

если бы решение не нашлось, можно было бы партиционировать данные в зависимости от времени, т.е. называть таблицы а-ля «LOGS_06-02-14» и на уровне приложения определять в какую таблицы писать и читать. старые таблицы периодически удалять, новый создавать. тогда не нужно будет блокировок и перезапусков приложения. это вроде довольно типичный подход к time-slice data.

val-amart ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.