|
|
|
|
|
для: Valick
(26.08.2011 в 08:51)
| | InnoDB же | |
|
|
|
|
|
|
|
для: Phantom
(25.08.2011 в 17:27)
| | у вас тип таблицы какой? | |
|
|
|
|
|
|
|
для: Valick
(25.08.2011 в 17:19)
| | Ещё вопрос. Очень плохо будет если в запрос на выборку случайных ссылок я вставлю FOR UPDATE и заключу в транзакцию этот запрос и UPDATE показов? Просто если не использовать FOR UPDATE, возникает эффект гонки. Запускал в цикле код в 30 параллельных потоков, в итоге количество показов часто получается больше, чем указанный лимит (всего лишь на один показ, но всё же нехорошо). С FOR UPDATE всё работает вроде как надо, но медленнее на общем фоне, если использовать 30 параллельных клиентов, что и понятно, так как таблица блокируется даже для выборки. | |
|
|
|
|
|
|
|
для: Phantom
(25.08.2011 в 16:59)
| | я инсетры в таблицу фигачу при каждом показе рекламных
а упдэйты фигачить не ломает?))
инсерт будет гораздо проще, тем более что в буфере, я бы не стал поля индексировать
Да и если пересчитывать допустим раз в сутки данные этой таблицы и заносить в таблицу статистики, то в течении текущего дня нельзя будет посмотреть статистику, а это бывает очень важно для рекламодателей. Ну вообще-то можно при просмотре статистики учитывать ещё и данные из буферной таблицы.
да, давно было... аж два года назад)) забыли уже, что пересчитывать можно в любой момент времени, хоть каждую секунду)
___
как делать это уже вам решать, тем более если уже все работает, то забейте) | |
|
|
|
|
|
|
|
для: Valick
(25.08.2011 в 16:19)
| | Помню эту тему =) Как давно это было. Странно, что вы её нашли.
>> Будь моя воля, я бы Вам приказал книги читать ;)
Таки почитал трошки :D :D :D
Мне не хочется делать буферную таблицу. Сейчас я делаю исключительно для себя и я знаю, что статистика будет не нужна. Да и сисадмин моего хостинга мне руки оторвёт, если узнает, что я инсетры в таблицу фигачу при каждом показе рекламных ссылок. Например на каждой странице сайта показывается 5 рекламных ссылок. Это пять инсертов при каждом посещении страницы. Таблица будет быстро раздуваться. Да и если пересчитывать допустим раз в сутки данные этой таблицы и заносить в таблицу статистики, то в течении текущего дня нельзя будет посмотреть статистику, а это бывает очень важно для рекламодателей. Ну вообще-то можно при просмотре статистики учитывать ещё и данные из буферной таблицы. Но всё равно мне кажется лучше просто увеличивать поле-счётчик в таблице статистики.
>> составной индекс UNIQUE (`link_id`,`time`) - скорее всего лично я бы так не сделал
Составной индекс нужен мне для использования совмещённого запроса INSERT + UPDATE, иначе не будет работать. | |
|
|
|
|
|
|
|
для: Phantom
(25.08.2011 в 14:54)
| | позвольте слегка освежить вам память :)
много можно почерпнуть из той темы, в частности буферную таблицу, куда можно инсёртить в темную голову
и кстати если пока не нужна статистика по браузерам или чему-то другому, все равно лучше проектировать таблицу так чтобы при необходимости это можно было легко добавить.
составной индекс UNIQUE (`link_id`,`time`) - скорее всего лично я бы так не сделал | |
|
|
|
|
|
|
|
для: Valick
(21.08.2011 в 17:46)
| | Как вы наверно уже догадались, запрос должен показывать ротацию рекламы на сайте. Я вот сейчас думаю, как лучше реализовать статистику. Статистика по браузерам и IP не нужна. Нужны только показы и переходы. Минимальная единица учёта: 1 час. Я сейчас сделал такую таблицу:
CREATE TABLE `statistics`(
`link_id` int(11) unsigned not null default 0,
`time` DATETIME,
`number_of_shows` int(11) unsigned not null default 0,
`number_of_hits` int(11) unsigned not null default 0,
UNIQUE (`link_id`,`time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
|
time устанавливается с интервалом в один час, то есть строки в таблице будут примерно такие:
link_id | time | number_of_shows | number_of_hits
------------------------------------------------------------------
1 | 2011-08-23 14:00:00 | 134 | 12
2 | 2011-08-23 14:00:00 | 110 | 11
3 | 2011-08-23 14:00:00 | 112 | 8
1 | 2011-08-23 15:00:00 | 234 | 19
3 | 2011-08-23 15:00:00 | 345 | 32
1 | 2011-08-23 16:00:00 | 123 | 13
1 | 2011-08-23 17:00:00 | 543 | 24
1 | 2011-08-23 18:00:00 | 534 | 28
------------------------------------------------------------------
|
Уникальный составной индекс UNIQUE (`link_id`,`time`) обеспечивает, чтобы каждой ссылке (link_id) в каждый час (time) соответствовала одна строка (ну или вообще ни одной), ну и по этим полям будет статистика выбираться, так что индекс в любом случае нужен.
При каждом показе какой-либо ссылки нужно увеличить поле number_of_shows на 1 (точно так же и с переходами, но с полем number_of_hits). Решалось бы просто апдейтом. Но проблема в том, что строки может и не быть, если в данный час с данной ссылки ещё не было ни одного показа или перехода. То есть при первом показе или переходе нужно не апдейтить, а создавать строку. В MySQL есть такая конструкция:
INSERT
INTO `statistics`
(`link_id`,`time`,`number_of_shows`,`number_of_hits`)
VALUES (...), (...), (...)
ON DUPLICATE KEY
UPDATE `number_of_shows`=`number_of_shows`+1
|
где (...), (...), (...) - это список данных для обновляемых/вставляемых ссылок (так как за один раз показывается несколько ссылок и обновлять показы для них всех одновременно нужно. Эта конструкция работает, но я не знаю оптимально ли? Насколько велики накладные расходы в подобном запросе. По сути инсерт будет выполняться один раз в час для каждой ссылки (либо вообще не будет, если ссылка в течении часа показана не будет), а вот апдейт уже при всех последующих показах данной ссылки в рамках данного часа. | |
|
|
|
|
|
|
|
для: Valick
(25.08.2011 в 12:27)
| | 22 года исполнилось. Я в общем-то пить и не начинал. Мог выпить шампанское или рюмку вина на большом празднике, но вот уже года четыре вообще не пью. =) | |
|
|
|
|
|
|
|
для: Phantom
(23.08.2011 в 21:37)
| | а лет сколько если не секрет? и как давно бросили пить?)) | |
|
|
|
|
|
|
|
для: Valick
(23.08.2011 в 17:26)
| | У меня каждый день повод не выпить. Даже сегодня. Я из принципа не пью спиртного. =) Спасибо за поздравление. | |
|
|
|
|