vitalets
@vitalets

Уменьшение размера БД

Всем привет,

хочу получить ваш совет по следующей задаче:
есть mysql база, в которой для работы в основном используются недавно добавленные записи (за последние 1-2 месяца). После использования данные по сути просто лежат в бд, занимая место и замедляя работу.
Но удалить их нельзя, т.к. иногда (нечасто) приходится делать отчеты за длительный срок, например за год и больше.
Вопрос — как все это оптимизировать?

Вариант 1:
Создать копию бд, которая будет служить архивом и раз в неделю переносить данные из основной базы старше 2-х месяцев. Использовать sql-скрипт c выражениями вида:
insert archive.document select * from prod.document where create_date <= DATE_SUB(now(), interval 2 month);
delete * from prod.document where create_date <= DATE_SUB(now(), interval 2 month);

Но как в этом случае писать запросы за длительный срок?
Использовать сложные скрипты с UNION или собирать общую базу из двух частей? И то и другое видится не очень удобным…

Вариант 2:
Опять же создать копию бд, которая будет служить архивом и настроить на нее репликацию. И потом каким-то хитрым образом удалять древние строки из основной базы, но чтобы эти изменения не реплицировались. Возможно ли такое в принципе?

Может есть еще какие-то варианты?
Спасибо!
  • Вопрос задан
  • 4102 просмотра
Пригласить эксперта
Ответы на вопрос 7
Dunadan
@Dunadan
А что мешает сделать аггрегацию статистики?

Например, Вы считатете количество просмотров определенной страницы.
Каждый хит — одна запись в БД с ай-пи адресом посетителя.

Для сводной таблицы вполне достаточно будет записи вида page_id, page_view_count, week_id, где
page_id — индекс страницы
page_view_count — просмотров страницы за неделю
week_id — порядковый номер недели в году.

Для отчетов из серии «за неделю-месяц-полгода-год» вполне пойдет. Можено еще количество хостов считать.

В результате вся статистика по одной странице за год займет аж 52 записи.
Ответ написан
Комментировать
@ztxn
Я правильно понимаю, что используя термины «бд»,«база» вы подразумеваете «таблица»?

Если так, можно посмотреть в сторону секционирования.
Ответ написан
Комментировать
vitalets
@vitalets Автор вопроса
2 Dunadan:
идею понял. Проблема в том, что заранее я не могу знать, по каким условиям запросят следующий отчет.

2 ztxn:
Нет, база это именно база. Данные для отчетов хранятся в основных 4-5 таблицах.
Секционирование смотрел. Насколько я понимаю, оно не уменьшит размер бд при дампах, верно?
Ответ написан
@zuborg
Может сделать триггер на insert на основную таблицу, который будет копировать строку в архивную таблицу. delete соотв оставлять без внимания. update/replace — смотрите сами.
Основные запросы делать на основную таблицу, а для отчетов — на архивную.
Ответ написан
@Vampiro
Эм… может что-нить типа
create or replace VIEW forFastReports as select * from mySlowTable where added_at < date_sub(now(),INTERVAL 1 DAY);?
Ответ написан
Я человек не образованный, УЗов не заканчивал — учился в основном по доступным книгам, так что сильно не пинайте :)
Есть такой термин как «денормализация данных». Я для таких случаев придумал для себя «денормализацию таблиц».
Например, у нас есть новостной ресурс, в котором нельзя физически удалять новости. Т.е. удаленные новости должны быть доступны при необходимости из панели управления, но для клиентской части они «отсутствуют». Я делал дубликат таблицы, в которую при удалении переносил запись со всеми полями. Это разгружало рабочую таблицу, но нагружало приложение в случае необходимости запроса к удаленной записи. А в виду того что таких запросов обычно в тысячи раз меньше — я остановился на таком подходе.

Т.е. я в своих решениях использовал (при необходимости) union совместно с кешированием.
Ответ написан
@odmin4eg
У меня подобная проблема, есть блог на WP в нём БД весит уже в районе 700-800мб

тоже всяко думал как бы старую инфу выливать в другие базы, думал что надо как-то опираться на года, если человек запросил пост с урлой /2008/ то берём данные из БД с именем site_2008

Но до практической реализации не дошло, унёс базу целиком на другой сервер, где много оперы и ресурсов.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы