[MySql] Статистика
В общем имею таблицу со статистикой. В ней данные уже за 4 месяца. Хочется выгрузить данные за первые два три месяца в другую базу и почистить текущую. Как это лучше всего организовать?
Таблица со статистикой занимает уже 1,7 гигабайта и имеет порядка 7 миллионов строк. Если это важно, то примари индекс по 2 столбцам + индексы еще по пяти столбцам. |
Ответ: [MySql] Статистика
Если bottleneck'ом является сами запросы на обработку информации, то лучше собирать статистику с минимум индексов, только с теми индексами, по которым ты будешь собирать кусок данных, например даты: выбираешь за один месяц все данные.
Сохраняешь данные за месяц в другую бд, если у тебя дома мощьный комп или есть еще где-то компьютер помощнее (CPU - здесь решает с широким буффером ОЗУ + SSD). Далее когда есть копия нужных данных за промежуток времени, делаешь уже статистику с этой копии. Работать с таблицей которая имеет только часть данных с которых тебе нужна статистика - лучше, чем работать с только 10% (например) данных с таблицы, т.к. индексы - это конечно хорошо, но рост таблицы замедлит запросы как не крути. Делаешь статистику, аггрегируешь данные как нужно, и дальше хранишь в удобном виде. У нас есть очень похожая ситуация, собираем очень много разной инфы, таблицы выросли до уже десятков и почти сотен миллионов записей. Нужно было реагировать. Написали несколько cron задач, которые время от времени собирают например вчерашние данные, и аггрегируют в более удобный и компактный формат, запись на день, и в другую коллекцию (используем mongodb). Затем основная таблица со всеми event'ами чистится, преждевременно сохраняя удаляемые данные в архивчик, чисто для бэкапов и хранения. Таким образом эта таблица уменьшилась и держит в себе только недавние события, а cron работы постоянно аггрегируют данные в более удобный формат. Например есть данные на каждую игровую сессию игрока. Время, во что поиграл, и ID сессии. Скрипт собирает вчерашние данные по каждой отдельной игре, создает массив на 24 часа (статистика по часам), и еще одно число "всего игр за день". И так на каждую игру в которую сыграли хоть раз за день. Если в игру сыграли предположим 24к раза за день, то в полночь создастя для этого проекта одна запись с этим массивом, и все 24к евентов будут архивированы и удалены из этой коллекции. Далее есть еще задачи которые собирают инфу по неделям и по месяцам, но они уже делают это из дневных данных. Таким образом у тебя есть постоянно собираемая статистика и автономно генерируются исторические данные, которые уже потом можно показывать разработчику в удобном виде. Если нужно добавить новый тип данных - сохраняешь все в ту же таблицу, и потом пишешь очередную cron задачу чтобы аггрегировалась статистика. Учти, что не всегда знаешь что за информацию сможешь извлечь из данных. Поэтому удалять данные статистики - не супер идея, лучше архивируй и храни где-то. Было пару раз когда нужно было сделать новый скрипт чтобы что-то сравнить несколько месяцев назад и совсем недавно. Если бы не было архивов данных, было бы грустно. |
Часовой пояс GMT +4, время: 16:34. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot