forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   PHP / MySQL (http://forum.boolean.name/forumdisplay.php?f=135)
-   -   [MySql] Статистика (http://forum.boolean.name/showthread.php?t=19857)

pax 01.06.2015 10:19

[MySql] Статистика
 
В общем имею таблицу со статистикой. В ней данные уже за 4 месяца. Хочется выгрузить данные за первые два три месяца в другую базу и почистить текущую. Как это лучше всего организовать?

Таблица со статистикой занимает уже 1,7 гигабайта и имеет порядка 7 миллионов строк.
Если это важно, то примари индекс по 2 столбцам + индексы еще по пяти столбцам.

moka 01.06.2015 15:15

Ответ: [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