Показать сообщение отдельно
Старый 01.06.2015, 15:15   #2
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: [MySql] Статистика

Если bottleneck'ом является сами запросы на обработку информации, то лучше собирать статистику с минимум индексов, только с теми индексами, по которым ты будешь собирать кусок данных, например даты: выбираешь за один месяц все данные.

Сохраняешь данные за месяц в другую бд, если у тебя дома мощьный комп или есть еще где-то компьютер помощнее (CPU - здесь решает с широким буффером ОЗУ + SSD).
Далее когда есть копия нужных данных за промежуток времени, делаешь уже статистику с этой копии. Работать с таблицей которая имеет только часть данных с которых тебе нужна статистика - лучше, чем работать с только 10% (например) данных с таблицы, т.к. индексы - это конечно хорошо, но рост таблицы замедлит запросы как не крути.

Делаешь статистику, аггрегируешь данные как нужно, и дальше хранишь в удобном виде.

У нас есть очень похожая ситуация, собираем очень много разной инфы, таблицы выросли до уже десятков и почти сотен миллионов записей. Нужно было реагировать.
Написали несколько cron задач, которые время от времени собирают например вчерашние данные, и аггрегируют в более удобный и компактный формат, запись на день, и в другую коллекцию (используем mongodb).
Затем основная таблица со всеми event'ами чистится, преждевременно сохраняя удаляемые данные в архивчик, чисто для бэкапов и хранения.

Таким образом эта таблица уменьшилась и держит в себе только недавние события, а cron работы постоянно аггрегируют данные в более удобный формат.

Например есть данные на каждую игровую сессию игрока. Время, во что поиграл, и ID сессии. Скрипт собирает вчерашние данные по каждой отдельной игре, создает массив на 24 часа (статистика по часам), и еще одно число "всего игр за день". И так на каждую игру в которую сыграли хоть раз за день.
Если в игру сыграли предположим 24к раза за день, то в полночь создастя для этого проекта одна запись с этим массивом, и все 24к евентов будут архивированы и удалены из этой коллекции.
Далее есть еще задачи которые собирают инфу по неделям и по месяцам, но они уже делают это из дневных данных.

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

Если нужно добавить новый тип данных - сохраняешь все в ту же таблицу, и потом пишешь очередную cron задачу чтобы аггрегировалась статистика.

Учти, что не всегда знаешь что за информацию сможешь извлечь из данных. Поэтому удалять данные статистики - не супер идея, лучше архивируй и храни где-то.
Было пару раз когда нужно было сделать новый скрипт чтобы что-то сравнить несколько месяцев назад и совсем недавно. Если бы не было архивов данных, было бы грустно.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (01.06.2015)