Подсчёт кол-ва хитов и хостов (триггер)

Статус
Закрыто для дальнейших ответов.

антиКИЛЛЕР

Well-Known Member
Регистрация
28.07.2011
Сообщения
92
Итак, есть таблица с тремя полями: ref_id, IP и datetime. В первом хранится идентификатор реферала, во втором IP в качестве числа, ну и дата-время в последнем. При этом таблица очень большая, на один день может быть более 100к записей.
Необходимо вести статистику количество хитов и хостов для каждого ref_id за прошедший день. Для этого я создал ещё одну таблицу с полями ref_id, hits, hosts и date, в поле date хранится только день.
На первую таблицу повесил триггер (на BEFORE INSERT):
Код:
BEGIN
 DECLARE referal INTEGER default null;
 DECLARE isHost INTEGER default null;

  SELECT `ref_id` INTO referal FROM `temp2` a WHERE a.`ref_id`=NEW.`ref_id` and a.`date`=CURDATE(); 
  IF (referal is null) THEN
    INSERT INTO `temp2` (`ref_id`,`hits`,`hosts`,`date`) VALUES (NEW.`ref_id`,1,1,CURDATE());
      ELSE
        SELECT 0 INTO isHost FROM `temp` WHERE `ref_id`=NEW.`ref_id` and `IP`=INET_ATON(NEW.`IP`) and DATE(`datatime`)=CURDATE();
        IF (isHost is null) THEN
          SELECT 1 INTO isHost FROM dual;
        END IF;
        UPDATE `temp2` SET `hits`=`hits`+1, `hosts`=`hosts`+isHost WHERE `ref_id`=NEW.`ref_id` and `date`=CURDATE();
  END IF;
END
Проблема кроется в неверном подсчёте количества хостов (в блоке ELSE). Хотя вроде всё логично. Если находим, что такой хост уже был, переменная isHost должна принять значение 0 и при UPDATE значение `hosts` не должно измениться (ибо +0). В случае если такого хоста не было, то в isHost засоввываем единичку.
Проблема в том, что количество хитов, всегда равно количеству хостов, даже если все добавляемые записи будут идеть один IP.
Подозреваю что я очень туплю уже не первый час, но никак не могу понять где.
Просьба вправить мне мозг)
 

Serg@NT

Well-Known Member
Регистрация
20.02.2010
Сообщения
506
Интересно вы как-то решили. Вместо ускорения процесса выдачи статистики вы в несколько раз замедлили процесс её сбора. Получается что при КАЖДОМ хите у вас выполняется куча работы в БД.
Всё проще делается.
1) Собирается статистика за день
2) На следующий день берёте всю эту статистику и пересчитываете в таблицу с агрегированными данными. Это можно сделать через фоновые процессы (или в некоторых СУБД назначенные задания есть).

В результате статистика считается 1 раз, а не более 100к, как в вашем примере.
 

marker

Well-Known Member
Регистрация
23.10.2010
Сообщения
399
Доп. информация

Определение IP адреса

Пусть вас не смущает PHP, если вы используете другой язык.
В этой статье описаны проблемы получения IP.
 

антиКИЛЛЕР

Well-Known Member
Регистрация
28.07.2011
Сообщения
92
Интересно вы как-то решили. Вместо ускорения процесса выдачи статистики вы в несколько раз замедлили процесс её сбора. Получается что при КАЖДОМ хите у вас выполняется куча работы в БД.
Всё проще делается.
1) Собирается статистика за день
2) На следующий день берёте всю эту статистику и пересчитываете в таблицу с агрегированными данными. Это можно сделать через фоновые процессы (или в некоторых СУБД назначенные задания есть).

В результате статистика считается 1 раз, а не более 100к, как в вашем примере.
Возможно вы и правы, такой вариант я тоже естественно рассматривал, но т.к. у меня нет опыта в этом деле то как раз и хотел сравнить на сколько триггер будет замедлять БД и т.д.
Ведь по сути, в этом варианте запросы не большие count по все таблице сразу, а довольно простые, но зато статистика в реальном времени.
 
Статус
Закрыто для дальнейших ответов.
Верх Низ