Нужна помощь зала в выборе/проектировании БД

D
На сайте с 14.01.2007
Offline
153
452

Есть большой многоязычный проект, который ежечасно пишет логи в виде:

язык;урл;кол-во посещений

это дано и изменению не подлежит.

"хочется" сделать из этого "красиво", с графиками по дням, урлам, языкам.

всего страниц около 1кк, языков 8, распределение неравномерное.

1 импорт - это примерно 200к страниц

моё решение сейчас: 1 импорт дня - 7 минут, дальше - 5. это на ноуте(какой-то i5, 8 ГБ оперативы) проц. при импорте занят на 4-5%, зато диски(7.200 rpm) работают на всю. сервак, на котором это будет крутиться, гораздо слабее. поэтому надо оптимизировать.

Как бы сделали вы? Своё решение специльно не пишу, чтобы у вас был не замыленный взгляд

V
На сайте с 10.01.2012
Offline
85
#1

Какая структура? какие данные вытягиваются? По какому принципу строится график

D
На сайте с 14.01.2007
Offline
153
#2

Varenik, mmm...

Varenik:
Какая структура?

язык;урл;кол-во посещений

Varenik:
какие данные вытягиваются? По какому принципу строится график
Dinozavr:
с графиками по дням, урлам, языкам.
V
На сайте с 10.01.2012
Offline
85
#3

язык;урл;кол-во посещений

с графиками по дням, урлам, языкам.

Соотношение понятно. по дням - не вижу этих данных для выборки

D
На сайте с 14.01.2007
Offline
153
#4

Varenik, да, неувязочка вышла:)

название файла содержит дату и время

Mutabors
На сайте с 17.09.2012
Offline
127
#5

Это обычная задача по написанию статистики ну или даже биллинга если хотите.

1. Ежечасно пишет логи... Почему ежечасно? Для чего нужен лишний агрегатор-посредник? Почему не собирать сразу из логов апача или энджинэкса? И к-во сообщений не нужно! нужно поле датавремя, а к-во сообщений сами будите обсчитывать.

2. Далее MySQL, с помощью LOAD INFILE загоняете новые данные с определенным интервалом. Работает очень быстро и оптимально.

3. Далее правильно проектируете БД, в Вашем случае оптимально нормализация по 2НФ. То есть основная таблица из трех столбцов, id,urlid.data

Вторая таблица соответственно id,url

4. Далее через определенный промежуток времени строите вспомогательные таблицы, с подсчетом посещений по каждой из ссылок за определенное время. Обычно оптимально таблицы, час, день, месяц. Они на порядок сэкономят Вам время выборки, которое при любом, даже самом изощренном запросе будет составлять в этом случае копейки.

5. Данный способ позволит реализовать Вам в дальнейшем кучу дополнительных появившихся хотелок, в виде добавления IP username и т.д. и т.п. Если нужно будет подробнее, то плс. в личку. В последнее время увы мало времени потому тут бываю не часто.

Самый продвинутый и надежный SSD хостинг рунета с изоляцией сайтов по 115 руб! (http://beget.ru/?id=332651) Контекстная реклама и продажи. Конкурентные и серые темы. Дорого! Не трать время на рутину! Ее сделают за копейки! (http://www.work-zilla.com?ref=143498)
D
На сайте с 14.01.2007
Offline
153
#6

Mutabors, 1. как я уже сказал: изменить это невозможно

3. так и сделал

2. никогда не работал с LOAD INFILE. что в файле? INSERTs,UPDATEs?

пример: в 0:0 для visits/url надо делать INSERT, потом только UPDATE. как это делается с файлом?

Mutabors
На сайте с 17.09.2012
Offline
127
#7

У Вас реально нет доступа к логам сервера? Или это просто предположение, что то, что у Вас уже есть сделает Вашу жизнь и систему в частности проще?

По LOAD INFILE, это способ самого простого, быстрого и экономного способа загонять большие объемы данных из файла в базу данных, читаем например тут.

А вот простой пример парсинга стандартных логов апача (первое, что на глаза попалось из собственного, рабочего):

LOAD DATA

INFILE '/1.log'

IGNORE

INTO TABLE 1weblog.tmplog

FIELDS TERMINATED BY ' '

LINES TERMINATED BY '\n'

(ip,@tmp,@tmp,@dt,@tz,@zapros,url,@prot,cod,byts)

SET dt = STR_TO_DATE(@dt,'[%d/%b/%Y:%H:%i:%S'), tz=LEFT(@tz,LENGTH(@tz)-1),

zapros=RIGHT(@zapros,LENGTH(@zapros)-1),

prot=LEFT(@prot,LENGTH(@prot)-1);

SK
На сайте с 10.07.2013
Offline
1
#8

Подумайте об использовании RRDtool.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий