powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
14 сообщений из 14, страница 1 из 1
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
    #35844767
Vexder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую всех. Спроектировал базу данных, но попал в тупик при даже сравнительно небольших объёмах (100к записей) в связи с очень медленной обработкой данных (до 1й минуты) Суть самого проекта в следующем. Это статистические данные по заходам посетителей. Вебмастер получает счётчик, ставит себе его на сайт и получает возможность смотреть уникальные и неуникальные заходы, группировать их по сайтам, странам. Как у меня всё устроено. Есть 3 таблицы: users, sites и daily_stats. В users - данные о пользователях, в sites - данные о сайтах, в countries - страны, daily_stats - вся статистика. Сами таблицы:

Таблица пользователей:
Код: plaintext
1.
2.
3.
4.
CREATE TABLE `users` (
  `id` int( 11 ) NOT NULL auto_increment,
  `username` varchar( 100 ) NOT NULL
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT= 11  DEFAULT CHARSET=utf8;

Таблица сайтов:
Код: plaintext
1.
2.
3.
4.
CREATE TABLE `sites` (
  `id` int( 11 ) NOT NULL auto_increment,
  `domain` varchar( 100 ) NOT NULL
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT= 11  DEFAULT CHARSET=utf8;

Таблица стран:
Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE `countries` (
  `id` int( 11 ) NOT NULL auto_increment,
  `code` varchar( 2 ) NOT NULL,
  `name` varchar( 100 ) NOT NULL
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT= 11  DEFAULT CHARSET=utf8;

Таблицы users, sites и countries - справочники. Пример:

idusername1user12user2

iddomain1domain1.com2domain2.com

idcodename1RUРоссия2UAУкраина

В моём случае служат исключительно для того, чтобы их джойнить к статсам и выводить имена сайтов, юзеров, стран для админа и для самих юзеров.

И, собственно, таблица статистики:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE `stats_last` (
  `crc` bigint( 20 ) NOT NULL default '0',
  `site_id` int( 11 ) NOT NULL default '0',
  `user_id` int( 11 ) NOT NULL default '0',
  `country_id` int( 10 ) default '0',
  `date` int( 11 ) unsigned default NULL,
  `hit_unique` int( 11 ) NOT NULL default '0',
  `hit_raw` int( 11 ) NOT NULL default '0',
  PRIMARY KEY  (`crc`),
  KEY `site_id` (`site_id`),
  KEY `user_id` (`user_id`),  
  KEY `date` (`date`),
  KEY `country_id` (`country_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Здесь внесу ясность по всем полям.

crc - это хеш-сумма даты ид сайта, ид юзера, ид страны.
site_id, user_id, country_id - ид соответствующих таблиц
date - дата в формате timestamp, с шагом в день (т.е. детализация статистики - это день)
hit_unique, hit_raw - статистика по посещениям.

С помощью crc я очень быстро могу занести данные в базу с помощью ON DUPLICATE ENTRY, т.к. мне не надо делать кучу проверок. По сути, для каждой комбинации данных (ид сайта, юзера, страны, даты) создаётся отдельная запись. Это позволяет делать выборку и группировать статистику по:

- Дате
- Сайтам
- Пользователям (для админа)
- Странам

Пример записей в таблице daily_stats:

crcsite_iduser_idcountry_iddatehit_uniquehit_raw11318984391211235854800101511318984392211235854800152511318984392111235854800571131898439122123585480024

Это очень удобная структура, как мне кажется, так как, чтобы отобразить статистику по дням, мне необходимо сделать один запрос:
Код: plaintext
SELECT SUM(hit_unique), SUM(hit_raw) FROM daily_stats GROUP_BY date

По юзерам:
Код: plaintext
SELECT SUM(hit_unique), SUM(hit_raw) FROM daily_stats GROUP_BY user_id

SUM(), как не трудно догадаться, служит для суммирования статистики для каждого юзера, сайта, даты (в зависимости от группировки) Таким образом, я могу видеть, сколько всего было заходов в такой-то день или у такого-то пользователя.

Что самое удобное в данной структуре, так это то, что я могу накладывать дополнительные фильтры, выбирая статистику по дополнительным критериям, к примеру, по промежуткам дат:
Код: plaintext
SELECT SUM(hit_unique), SUM(hit_raw) FROM daily_stats WHERE date= 1235854800  GROUP_BY user_id

JOIN делаю, когда необходимо совместить две таблицы и вывести помимо статистики ещё и имена польователей или сайты. По типу:
Код: plaintext
SELECT SUM(s.hit_unique), SUM(s.hit_raw),u.username FROM daily_stats s LEFT JOIN users u ON u.id=s.user_id GROUP_BY s.user_id

Так вот, всё это просто шикарно работает на сравнительно небольшой базе. Выборки можно делать очень гибкими. Но при размере базы в 100к (а скорость её роста в месяц примерно такая и есть) она начинает просто дико тормозить даже на обычных SUM запросах:
Код: plaintext
SELECT SUM(s.hit_unique) as total FROM daily_stats
Ладно, это я могу кешировать, но вот статистика, сгруппированная по размым критериям - я не могу ничего с ней поделать и она дико тормозит, как бы я не старался. 10 пользователей, 10 стран у каждого, 10 сайтов и 100 дней и скорость открытия такой статистики около 20и секунд. А это вообще беда, т.к. всё должно отрабатывать менее чем за одну секунду, как это делается у других.

Так как мне, в основном, необходима статистика, с группированная по сайтам, пользователям, странам, датам, то я решил переделать структуру и разбить таблицу daily_stats на соответствующие таблицы: stats_bysite, stats_byuser, stats_bycountry, stats_bydate. Вот так выглядят поля:
crcsite_iddatehit_uniquehit_raw
crcuser_iddatehit_uniquehit_raw
crccountry_iddatehit_uniquehit_raw
Записывать в каждую таблицу уже просуммированные значения и всё, во время вывода необходима будет выборка исключительно по дате, т.к. всё остальное будет уже просуммированно и сгруппировано.

Но вот ведь проблема. Группировать и суммировать ведь тоже когда то необходимо. Статистика уже получается не риалтайм, а её необходимо дампить раз в какое-то время. Раз в минуту, к примеру. Тогда логика работы такова:

Изначально всё пишется в общую таблицу daily_stats, структура у которой прежнаяя. Раз в период времени скрипт берёт данные, группирует и суммирует их сначала по сайтам, затем по юзерам, затем по странам, затем по датам и запишсывает каждый результат в свою таблицу. Затем daily_stats очищается.

Но тут проблема какого характера... А если у меня тысяча пользователей, тысяча стран? И в момент сбора статистики она (статистика) будет у всех пользователей, то мне придётся делать кучу INSERT ON DUPLICATE ENTRY UPDATE для группы каждого типа. И неизвестно, сколько это займёт времени.

Итак, следующие вопросы. Как вообще организуются хранилища подобной информации и какая у них структура? Рассматривается MySQL и один среднестатистический сервер.
И во второй моей структуре с различными группировками и, по сути, кешированию всего - нет ли в ней косяков? Т.к. мне кажется, что нагрузка будет всё равно, если не в момент чтения, то в момент записи. И как мне во втором варианте, к примеру, сделать выборку с группировкой по сайтам, но определённого пользователя? В первой моей структуре это делается очень просто:
Код: plaintext
SELECT * FROM daily_stats WHERE user_id= 1  GROUP BY site_id
Как это сделать во второй - у меня нет идей, кроме как хранить дополнительно общую базу со всей статистикой и подобные сложные запросы выполнять через неё.

Заранее огромное спасибо!
...
Рейтинг: 0 / 0
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
    #35844833
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, тебе просто нужна нормальная СУБД?
...
Рейтинг: 0 / 0
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
    #35844878
Vexder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Речь идёт конкретно о MySQL. По ряду причин я не могу использовать другую СУБД. Если использовать нормальную СУБД типа Оракла, то и писать надо на нормальном языке, а не на PHP.

Для MySQL моя задача вообще не должна быть проблемой, т.к. подобные проекты есть и их куча, но я не знаю структур их баз. Да и я ничего фантастического не написал вроде бы...
...
Рейтинг: 0 / 0
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
    #35844898
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам бы сначала в ветку MySQL обратиться, прежде чем думать об изменении
структуры. Иногда один удачный индекс может быть "лекарством" от "тормозов".


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
    #35844918
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> нормальную СУБД типа Оракла

Чем Oracle нормальнее MySQL, можно поинтересоваться? Imho обычный кривой кусок дерьма, только без исходников, в отличие от MySQL, и с не реальной самооценкой апологетов (часто обычных ламеров, но с растопыренными пальцами и чрезмерной зарплатой).

> я не знаю структур их баз

А что, open source билинги типа уже совсем закончились? Или open source конфликтует с Вашими религиозными убеждениями?

Хотите очень быстро - разделяйте raw и отчетную базу, используйте агрегаты.
...
Рейтинг: 0 / 0
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
    #35844939
Vexder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Senya_L,

Не хотелось бы уже кросспостить. Тем более, здесь у меня в основных запросах везде фигурирует GROUP BY, который вроде как не дружит с индексами. Вот мой EXPLAIN:

Код: plaintext
SELECT username, SUM(hit_unique) FROM daily_stats LEFT JOIN users ON users.id=daily_stats.user_id GROUP BY user_id;


idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra 1SIMPLEdaily_statsALLNULLNULLNULLNULL630Using temporary; Using filesort1SIMPLEuserseq_refPRIMARYPRIMARY4mybase.daily_stats.user_id1

guest_20040621 Я вообще не хочу вступать в полемику, что лучше, MySQL или Oracle или что-либо другое. В моём случае есть MySQL и всё.

OpenSource ни с чем не конфликтует, но при чём тут вообще биллинги? Биллинг - это не статистика, а процессинг, тарификация, ведение учётов и т.п. Я ещё посмотрю открытые системы статистики, но всё что я видел - либо глючное либо не того формата, который мне необходим.
...
Рейтинг: 0 / 0
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
    #35844945
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> при чём тут вообще биллинги?

При том, что это похожие задачи.

> Биллинг - это не статистика

Дружище, Вы вообще понимаете, о чем говорите?

> либо глючное либо не того формата, который мне необходим

Похоже, Вам рановато заниматься проектированием. Может, лучше назад, в песочницу?
...
Рейтинг: 0 / 0
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
    #35844966
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vexder пишет:
> Приветствую всех. Спроектировал базу данных, но попал в тупик при даже
> сравнительно небольших объёмах (100к записей) в связи с очень медленной

Кросспостер, блин... Я тебе уже на rsdn ответил.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
    #35844967
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L пишет:

> Вам бы сначала в ветку MySQL обратиться, прежде чем думать об изменении
> структуры. Иногда один удачный индекс может быть "лекарством" от

Не при чём там MySQL. Там никакой специфики нет.
Общий вопрос по проектированию.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
    #35844978
Senya_L
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Верю. Я даже в задачу вдаваться не стал (уж дюже больно много автор
понаписАл). Просто негоже не испробовав штатные методы оптимизации что
называется, рубить с плеча. А с MySQL я вообще никак не дружен, потому
посоветовал обратиться в профильную ветку.

ЗЫ. Кстати, после более подробного прочтения исходного поста. Думаю насчет
хранимых агрегатов - дельная мысль.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
    #35844997
Q
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Q
Гость
Vexderфигурирует GROUP BY, который вроде как не дружит с индексами
Вас, вероятно, кто-то обманул...
VexderДумаю насчет хранимых агрегатов
Это хорошо. Заодно можно подумать о регламенте трансформации (актуализации сводной статистики) и ликвидации устаревающих первичных данных биллинга. :)
...
Рейтинг: 0 / 0
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
    #35845016
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Senya_L пишет:

> Верю. Я даже в задачу вдаваться не стал (уж дюже больно много автор
> понаписАл). Просто негоже не испробовав штатные методы оптимизации что
> называется, рубить с плеча.

Там нечего оптимизировать с точки зрения СУБД.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
    #35846081
Vexder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest_20040621 Умник, иди понтуйся в другое место. К примеру, в ту же песочницу. И заведи себе имя, после чего будем общаться. А то нашёлся понторез. Когда у тебя будет проходить по 10к транзакций в сутки и будет собственный биллинг - приходи, поговорим.

В остальном, спасибо всем! Правда, ничего нового не узнал :) Буду делать по второму своему варианту.

На счёт нормальной СУБД. Было бы интересно услышать, что есть нормальная СУБД, а что есть ненормальная. Я считаю такие проекты, как wikipedia, facebook, youtube не просто крупными, а крупнейшими в мире. Они все вертятся на MySQL. Инфа к размышлению.

Пойду копошить сорцфордж.
...
Рейтинг: 0 / 0
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
    #35846185
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vexder пишет:

> На счёт нормальной СУБД. Было бы интересно услышать, что есть нормальная
> СУБД, а что есть ненормальная.

Это ерунда. MySQL в этом смысле - вполне себе нормальная СУБД.
Ну, да, не очень она хороша, но главное, что есть для производительности,
там есть: кэши и индексы. Это же есть, и обязательно есть, в любой другой СУБД.

Я считаю такие проекты, как wikipedia,
> facebook, youtube не просто крупными, а крупнейшими в мире. Они все
> вертятся на MySQL. Инфа к размышлению.

Это как раз не показатель. Есть специальные методы работы именно
web-проектов, которые масштабность таких систем сглаживают,
и это - не заслуга СУБД ни в коем случае.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]