программерское

Mar 18, 2009 01:15

Увлечение Scala можно считать серьёзным - нашёл в нёй первую ошибку (Add: и исправил, Add2: commit#17380). Очень приятный язык. Если 5 лет назад, когда я увлекался Scheme (и даже написал её компилятор в JavaScript), была возможность в одном крупном проекте использовать любые языки и средства - я всё-таки не рискнул, а сейчас в такой же ситуации ( Read more... )

it, recommend, scala

Leave a comment

cathody March 18 2009, 11:01:00 UTC
Кстати, по highload-у есть задачка

Reply

alex14san March 18 2009, 16:37:28 UTC
какая?

Reply

cathody March 18 2009, 19:25:21 UTC
Текущее состояние:
1) в MySQL-е есть табличка log (serial log_id, int time, int date, char campaign, char product, char fromsearchengine, char country) , в которую пишутся хиты по странице (там 1 insert и 1 select last_insert_id), прочая информация хранится в других таблицах, присоединяемых по log_id ( соответствие many to one).

Когда табличка опухает до 2-3 млн. записей, генерация отчётов ( к примеру, взятие всех хитов в интервале [time1;time2] и группировка по campaign) занимает какое-то совсем неприличное время ~10 cек. Более изъёбистые запросы типа (взять все хиты в промежутке, сгруппировать по campaign и fromsearchengine, после чего посчитать себестоимость по табличке engine ( char campaign, char engine, double cost) радует глаз 30-40-секундной задумчивостью. Трекинг хитов при этом тоже "умирает".

Вопрос: как переписать/переделать эту хню, чтобы не тормозило? По ТЗ, система должна ставиться на виртуальный хостинг и планируемое число кликов порядка 80 000 в день "ровным слоем", а отчёты просматривает один чел?

Reply

alex14san March 18 2009, 20:44:32 UTC
1) insert на страницу - абсолютно не дело, по уму надо иметь некий буфер, в котором накапливаются данные для вставки, и периодически вставлять в базу сразу всю пачку ( ... )

Reply

alex14san March 18 2009, 20:45:44 UTC
если нет триггеров то обновления этих агрегированных таблиц делается ручным запросами там же где и пишется log

Reply

alex14san March 18 2009, 20:47:36 UTC
если нужна разбивка по времени - делаешь заранее группировку по часам, или по 10-минутным интервалам, и в отчете можно выбрать не произвольный временной диапазон а только по заранее выбранной гранулярности

Reply

alex14san March 18 2009, 20:49:23 UTC
ну и составные индексы - наше всё

Reply

cathody March 18 2009, 20:50:39 UTC
, по уму надо иметь некий буфер,

Есть проблема: доступа к кронду нет, согласно ТЗ.

баловство

Ага. И очень обидно, когда из-за отчёта лог теряется.

По п.3 - по ТЗ минимальная гранулярность - 10 минут, в чём вся засада.

Reply

alex14san March 18 2009, 21:02:57 UTC
если у пхп есть APC буфер можно хранить в нём. 10 минут вполне нормальная гранулярность, в чём проблема-то?

Reply

cathody March 18 2009, 21:07:25 UTC
Число записей не сильно снижается, но можно попробовать (хотя поиметь 10-15 INSERT-ов на 1 track - это больно) APC буфер - в PHP4 он есть? (ТЗ не я писал, если чо).

Reply

alex14san March 18 2009, 21:28:13 UTC
так тебя число записей волнует или 10-40 секундные select-ы?

Reply

cathody March 18 2009, 21:30:19 UTC
Нащёт записей я ступил - там один доп. инсёрт возникает. Но больше волнуют 10-40 секундные селекты

Reply

alex14san March 18 2009, 21:35:39 UTC
ну и создай для них таблицы с precalculated данными

Reply


Leave a comment

Up