У меня есть рекламный сайт, и я изо всех сил пытаюсь найти наиболее эффективный способ обработки статистики. Моя цель — показывать уникальных посетителей и кликов за день.
Вот как это работает: издатели могут добавить веб-сайт, а затем добавить к нему неограниченное количество рекламных пространств, чтобы у них могло быть несколько баннеров на одной и той же странице или на разных страницах.
WEBSITES
id | url
ADSPACES
id | website_id | info
VIEWS
id | adspace_id | ip | date (YYYY-MM-DD)
ADSPACES_STATS
id | adspace_id | views | date (YYYY-MM-DD)
WEBSITES_STATS
id | website_id | views | date (YYYY-MM-DD)
Скрипт для обновления просмотров и кликов для рекламных пространств уже сделан:
$getViewsByAdspace = $db->query('SELECT count(*) as views, adspace FROM views WHERE date="'.date('Y-m-d').'" GROUP BY adspace ORDER BY id ASC');
while($getViewsForAdspace = $getViewsByAdspace->fetch(PDO::FETCH_ASSOC))
{
$adspaceId = $getViewsForAdspace['adspace'];
$adspaceViews = $getViewsForAdspace['views'];
if( $db->query('UPDATE adspace_stats SET views='.$adspaceViews.' WHERE adspace='.$adspaceId.' AND date="'.date('Y-m-d').'"')->rowCount() == 0 )
$db->exec('INSERT IGNORE INTO adspace_stats (adspace, date, views, clicks) VALUES ('.$adspaceId.', "'.date('Y-m-d').'", '.$adspaceViews.', 0)');
}
Сценарий запускается каждый час.
Теперь мне нужен скрипт для обновления статистики по сайтам. Я не могу найти эффективный способ сделать это, приведенный выше сценарий занимает около 20 секунд с таблицей из 10 миллионов записей, что идеально.
Я вижу только так:
Получите все рекламные пространства, которые принадлежат веб-сайту, и затем запросите это: SELECT COUNT(DISTINCT ip) as views FROM views WHERE (adspace=x OR adspace=Y ...) AND date=today
Это отстой, но это работает.
$websites = $db->query('SELECT * FROM websites WHERE state=0 ORDER BY id ASC');
while($website = $websites->fetch(PDO::FETCH_ASSOC))
{
$query='';
$getAdspacesByWebsite = $db->query('SELECT * FROM adspaces WHERE state=1 AND website='.$website['id'].' ORDER BY id ASC');
while($adspace = $getAdspacesByWebsite->fetch(PDO::FETCH_ASSOC))
{
$query.='OR adspace="'.$adspace['uniqid'].'" ';
}
if( $query!='' ) {
$query = 'SELECT count(DISTINCT ip) as views FROM views WHERE date="' . date('Y-m-d') . '" AND (' . substr($query, 3) . ') ORDER BY id ASC';
$result = $db->query($query)->fetch(PDO::FETCH_ASSOC);
if( $db->query('UPDATE websites_stats SET views='.$result['views'].' WHERE website='.$website['id'].' AND date="'.date('Y-m-d').'"')->rowCount() == 0 )
$db->exec('INSERT IGNORE INTO websites_stats (website, date, views, clicks) VALUES ('.$website['id'].', "'.date('Y-m-d').'", '.$result['views'].', 0)');
}
}
Других решений пока нет …