Подсчёт траффика по определённому тарифу

Технические вопросы по UTM 5.0
Ответить
web-monster
Сообщения: 5
Зарегистрирован: Вт май 18, 2010 17:46

Подсчёт траффика по определённому тарифу

Сообщение web-monster »

Здравствуйте, написал скрипт который подсчитывает трафик по определённому тарифному плану, скрипт работает но очень очень долго. 5 человек минут 20 выбирает. Собственно вот код:

Код: Выделить всё

$query = mysql_query("SELECT t1. *, t4.value,t3.login,t3.full_name,t3.actual_address,t3.home_telephone,t3.mobile_telephone
FROM service_links t1
INNER JOIN users t3
ON t1.account_id=t3.id
INNER JOIN user_additional_params t4
ON t1.account_id=t4.userid AND t4.paramid='1'
WHERE t1.service_id = 'сервисная связка(тариф)' AND t1.is_deleted!='1'
GROUP BY t1.account_id");

while($row = mysql_fetch_array($query))
{
$id=$row["account_id"];
$balance=round($row["balance"],3);
$tariff=tarif($id);
$user=$row["full_name"];
$login=$row["login"];
$adress=$row["actual_address"];
$home_telephone=$row["home_telephone"];
$mob_telefon=$row["mobile_telephone"];
$connect_date=russian_date( ' j F Y года', $row["connect_date"]);
mysql_query('SET NAMES UTF8');


$trafikres=mysql_query("
	      SELECT 
	        discount_transactions_iptraffic_all.account_id, 
	        Sum(discount_transactions_iptraffic_all.bytes) AS bytes, 
	        Sum(discount_transactions_iptraffic_all.discount) AS discount, 
	        t_class.t_class_name, 
	        discount_transactions_iptraffic_all.base_cost 
	      FROM 
	        discount_transactions_iptraffic_all 
	        LEFT OUTER JOIN t_class ON (t_class.id = discount_transactions_iptraffic_all.t_class) 
	      WHERE 
	        discount_transactions_iptraffic_all.account_id = '$id' AND 
		t_class.id = '10' AND
	        discount_transactions_iptraffic_all.discount_date_month >= '$period_start_date' AND 
	        discount_transactions_iptraffic_all.discount_date_month <= '$period_end_date' 
	      GROUP BY 
	        discount_transactions_iptraffic_all.account_id, 
	        t_class.t_class_name
	"&#41;;


//----------------------------Входящий трафик--------------------------------
$trafikrowin = mysql_fetch_array&#40;$trafikres&#41;; 
$trafik_in=$trafikrowin&#91;'bytes'&#93;;
if&#40;empty&#40;$trafik_in&#41;&#41; 
&#123;
$trafik_in = "0";
&#125;
else 
&#123;
$trafik_in = round&#40;toMegabyte&#40;$trafikrowin&#91;'bytes'&#93;&#41;, 2&#41;;
$trafik_in = str_replace&#40;"." , "," , $trafik_in&#41;;
&#125;
Индексы в таблице с трафиком по полям: account_id и date_month
Таблица весит 6гб
На выходе имеем $trafik_in это трафик за период между $period_start_date и $period_end_date
Как можно оптимизировать или по другому выполнить задачу?

Pulse
Сообщения: 945
Зарегистрирован: Вт окт 03, 2006 12:58

Сообщение Pulse »

вы не те поля берёте в запросе
FROM service_links t1
INNER JOIN users t3
ON t1.account_id=t3.id
account_id сравниваете с users.id это не верно

web-monster
Сообщения: 5
Зарегистрирован: Вт май 18, 2010 17:46

Сообщение web-monster »

Суть собственно не в этом даже если без привязки таблицы users и остальных просто из массива выбирать трафик он делает очень долго.

Даже если так:

Код: Выделить всё

$query = mysql_query&#40;"SELECT t1. * FROM service_links t1
WHERE t1.service_id = 'сервисная связка&#40;тариф&#41;' AND t1.is_deleted!='1'
GROUP BY t1.account_id"&#41;;

while&#40;$row = mysql_fetch_array&#40;$query&#41;&#41;
&#123;
$id=$row&#91;"account_id"&#93;;


$trafikres=mysql_query&#40;"
         SELECT
           discount_transactions_iptraffic_all.account_id,
           Sum&#40;discount_transactions_iptraffic_all.bytes&#41; AS bytes,
           Sum&#40;discount_transactions_iptraffic_all.discount&#41; AS discount,
           t_class.t_class_name,
           discount_transactions_iptraffic_all.base_cost
         FROM
           discount_transactions_iptraffic_all
           LEFT OUTER JOIN t_class ON &#40;t_class.id = discount_transactions_iptraffic_all.t_class&#41;
         WHERE
           discount_transactions_iptraffic_all.account_id = '$id' AND
      t_class.id = '10' AND
           discount_transactions_iptraffic_all.discount_date_month >= '$period_start_date' AND
           discount_transactions_iptraffic_all.discount_date_month <= '$period_end_date'
         GROUP BY
           discount_transactions_iptraffic_all.account_id,
           t_class.t_class_name
   "&#41;;


//----------------------------Входящий трафик--------------------------------
$trafikrowin = mysql_fetch_array&#40;$trafikres&#41;;
$trafik_in=$trafikrowin&#91;'bytes'&#93;;
if&#40;empty&#40;$trafik_in&#41;&#41;
&#123;
$trafik_in = "0";
&#125;
else
&#123;
$trafik_in = round&#40;toMegabyte&#40;$trafikrowin&#91;'bytes'&#93;&#41;, 2&#41;;
$trafik_in = str_replace&#40;"." , "," , $trafik_in&#41;;
&#125;

gil
Сообщения: 355
Зарегистрирован: Вт ноя 11, 2008 14:28

Сообщение gil »

зачем вам t_class.t_class_name в group by?

web-monster
Сообщения: 5
Зарегистрирован: Вт май 18, 2010 17:46

Сообщение web-monster »

Можно сделать так разницы нет:

Код: Выделить всё

SELECT account_id,Sum&#40;bytes&#41; AS bytes 
FROM discount_transactions_iptraffic_all 
WHERE account_id = 'пользователь'
AND discount_date_month >= '1270065600'
AND discount_date_month <= '1272657600'
AND t_class = '10'
GROUP BY account_id

gil
Сообщения: 355
Зарегистрирован: Вт ноя 11, 2008 14:28

Сообщение gil »

а у меня разница появилась.
попробуйте поставить индекс account_id, discount_date_month.

Ответить