|
|
|
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
|
|||
|---|---|---|---|
|
#18+
Приветствую всех. Спроектировал базу данных, но попал в тупик при даже сравнительно небольших объёмах (100к записей) в связи с очень медленной обработкой данных (до 1й минуты) Суть самого проекта в следующем. Это статистические данные по заходам посетителей. Вебмастер получает счётчик, ставит себе его на сайт и получает возможность смотреть уникальные и неуникальные заходы, группировать их по сайтам, странам. Как у меня всё устроено. Есть 3 таблицы: users, sites и daily_stats. В users - данные о пользователях, в sites - данные о сайтах, в countries - страны, daily_stats - вся статистика. Сами таблицы: Таблица пользователей: Код: plaintext 1. 2. 3. 4. Таблица сайтов: Код: plaintext 1. 2. 3. 4. Таблица стран: Код: plaintext 1. 2. 3. 4. 5. Таблицы users, sites и countries - справочники. Пример: idusername1user12user2 iddomain1domain1.com2domain2.com idcodename1RUРоссия2UAУкраина В моём случае служат исключительно для того, чтобы их джойнить к статсам и выводить имена сайтов, юзеров, стран для админа и для самих юзеров. И, собственно, таблица статистики: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Здесь внесу ясность по всем полям. 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 По юзерам: Код: plaintext SUM(), как не трудно догадаться, служит для суммирования статистики для каждого юзера, сайта, даты (в зависимости от группировки) Таким образом, я могу видеть, сколько всего было заходов в такой-то день или у такого-то пользователя. Что самое удобное в данной структуре, так это то, что я могу накладывать дополнительные фильтры, выбирая статистику по дополнительным критериям, к примеру, по промежуткам дат: Код: plaintext JOIN делаю, когда необходимо совместить две таблицы и вывести помимо статистики ещё и имена польователей или сайты. По типу: Код: plaintext Так вот, всё это просто шикарно работает на сравнительно небольшой базе. Выборки можно делать очень гибкими. Но при размере базы в 100к (а скорость её роста в месяц примерно такая и есть) она начинает просто дико тормозить даже на обычных SUM запросах: Код: plaintext Так как мне, в основном, необходима статистика, с группированная по сайтам, пользователям, странам, датам, то я решил переделать структуру и разбить таблицу 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 Заранее огромное спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2009, 17:22 |
|
||
|
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
|
|||
|---|---|---|---|
|
#18+
Может, тебе просто нужна нормальная СУБД? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2009, 18:48 |
|
||
|
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
|
|||
|---|---|---|---|
|
#18+
Речь идёт конкретно о MySQL. По ряду причин я не могу использовать другую СУБД. Если использовать нормальную СУБД типа Оракла, то и писать надо на нормальном языке, а не на PHP. Для MySQL моя задача вообще не должна быть проблемой, т.к. подобные проекты есть и их куча, но я не знаю структур их баз. Да и я ничего фантастического не написал вроде бы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2009, 19:37 |
|
||
|
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
|
|||
|---|---|---|---|
|
#18+
Вам бы сначала в ветку MySQL обратиться, прежде чем думать об изменении структуры. Иногда один удачный индекс может быть "лекарством" от "тормозов". Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2009, 19:59 |
|
||
|
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
|
|||
|---|---|---|---|
|
#18+
> нормальную СУБД типа Оракла Чем Oracle нормальнее MySQL, можно поинтересоваться? Imho обычный кривой кусок дерьма, только без исходников, в отличие от MySQL, и с не реальной самооценкой апологетов (часто обычных ламеров, но с растопыренными пальцами и чрезмерной зарплатой). > я не знаю структур их баз А что, open source билинги типа уже совсем закончились? Или open source конфликтует с Вашими религиозными убеждениями? Хотите очень быстро - разделяйте raw и отчетную базу, используйте агрегаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2009, 20:17 |
|
||
|
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
|
|||
|---|---|---|---|
|
#18+
Senya_L, Не хотелось бы уже кросспостить. Тем более, здесь у меня в основных запросах везде фигурирует GROUP BY, который вроде как не дружит с индексами. Вот мой EXPLAIN: Код: plaintext idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra 1SIMPLEdaily_statsALLNULLNULLNULLNULL630Using temporary; Using filesort1SIMPLEuserseq_refPRIMARYPRIMARY4mybase.daily_stats.user_id1 guest_20040621 Я вообще не хочу вступать в полемику, что лучше, MySQL или Oracle или что-либо другое. В моём случае есть MySQL и всё. OpenSource ни с чем не конфликтует, но при чём тут вообще биллинги? Биллинг - это не статистика, а процессинг, тарификация, ведение учётов и т.п. Я ещё посмотрю открытые системы статистики, но всё что я видел - либо глючное либо не того формата, который мне необходим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2009, 20:44 |
|
||
|
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
|
|||
|---|---|---|---|
|
#18+
> при чём тут вообще биллинги? При том, что это похожие задачи. > Биллинг - это не статистика Дружище, Вы вообще понимаете, о чем говорите? > либо глючное либо не того формата, который мне необходим Похоже, Вам рановато заниматься проектированием. Может, лучше назад, в песочницу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2009, 20:57 |
|
||
|
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
|
|||
|---|---|---|---|
|
#18+
Vexder пишет: > Приветствую всех. Спроектировал базу данных, но попал в тупик при даже > сравнительно небольших объёмах (100к записей) в связи с очень медленной Кросспостер, блин... Я тебе уже на rsdn ответил. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2009, 21:36 |
|
||
|
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
|
|||
|---|---|---|---|
|
#18+
Senya_L пишет: > Вам бы сначала в ветку MySQL обратиться, прежде чем думать об изменении > структуры. Иногда один удачный индекс может быть "лекарством" от Не при чём там MySQL. Там никакой специфики нет. Общий вопрос по проектированию. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2009, 21:37 |
|
||
|
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Верю. Я даже в задачу вдаваться не стал (уж дюже больно много автор понаписАл). Просто негоже не испробовав штатные методы оптимизации что называется, рубить с плеча. А с MySQL я вообще никак не дружен, потому посоветовал обратиться в профильную ветку. ЗЫ. Кстати, после более подробного прочтения исходного поста. Думаю насчет хранимых агрегатов - дельная мысль. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2009, 21:45 |
|
||
|
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
|
|||
|---|---|---|---|
|
#18+
Vexderфигурирует GROUP BY, который вроде как не дружит с индексами Вас, вероятно, кто-то обманул... VexderДумаю насчет хранимых агрегатов Это хорошо. Заодно можно подумать о регламенте трансформации (актуализации сводной статистики) и ликвидации устаревающих первичных данных биллинга. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2009, 22:21 |
|
||
|
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
|
|||
|---|---|---|---|
|
#18+
Senya_L пишет: > Верю. Я даже в задачу вдаваться не стал (уж дюже больно много автор > понаписАл). Просто негоже не испробовав штатные методы оптимизации что > называется, рубить с плеча. Там нечего оптимизировать с точки зрения СУБД. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.03.2009, 22:40 |
|
||
|
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
|
|||
|---|---|---|---|
|
#18+
guest_20040621 Умник, иди понтуйся в другое место. К примеру, в ту же песочницу. И заведи себе имя, после чего будем общаться. А то нашёлся понторез. Когда у тебя будет проходить по 10к транзакций в сутки и будет собственный биллинг - приходи, поговорим. В остальном, спасибо всем! Правда, ничего нового не узнал :) Буду делать по второму своему варианту. На счёт нормальной СУБД. Было бы интересно услышать, что есть нормальная СУБД, а что есть ненормальная. Я считаю такие проекты, как wikipedia, facebook, youtube не просто крупными, а крупнейшими в мире. Они все вертятся на MySQL. Инфа к размышлению. Пойду копошить сорцфордж. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2009, 14:29 |
|
||
|
Организация базы для сервера статистики, решение проблемы скорости и критика моего решения
|
|||
|---|---|---|---|
|
#18+
Vexder пишет: > На счёт нормальной СУБД. Было бы интересно услышать, что есть нормальная > СУБД, а что есть ненормальная. Это ерунда. MySQL в этом смысле - вполне себе нормальная СУБД. Ну, да, не очень она хороша, но главное, что есть для производительности, там есть: кэши и индексы. Это же есть, и обязательно есть, в любой другой СУБД. Я считаю такие проекты, как wikipedia, > facebook, youtube не просто крупными, а крупнейшими в мире. Они все > вертятся на MySQL. Инфа к размышлению. Это как раз не показатель. Есть специальные методы работы именно web-проектов, которые масштабность таких систем сглаживают, и это - не заслуга СУБД ни в коем случае. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2009, 14:55 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35844898&tid=1543403]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
174ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 229ms |
| total: | 516ms |

| 0 / 0 |
