К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Помогите составить запрос SQL

Гость
0 - 29.03.2012 - 07:41
Слабо взадею SQL, но есть задача обработки большого количества данных. Есть большая база с логами прокси сервера.
Сейчас сервер думает перед выдачей пол минуты.
Код на Perl следующий:
Код:
  my $sth = $dbh->prepare("SELECT DISTINCT src_ip FROM packets WHERE DATE(ts) LIKE '$day'");
  $sth->execute();
  while(@row = $sth -> fetchrow_array) **
    
    my $sth2 = $dbh->prepare("SELECT SUM( recv ), SUM( sent ) FROM packets WHERE DATE(ts) LIKE '$day' AND src_ip LIKE '$row[0]'");
    $sth2->execute();	
	($summa_recv, $summa_sent) = $sth2->fetchrow_array;
	
	print "<tr><td>".$row[0]."</td><td>".&size_view($summa_recv)."</td><td>".&size_view($summa_sent)."</td></tr><br>";
	
  **
  $sth->finish();
Выводит следующую информацию:
Код:
Потребление за 2012-03-27
IP	Входящий	Исходящий
10.0.0.70	365.2 MB	15.6 MB
10.0.0.114	2.3 GB	139.9 MB
10.0.0.21	11.7 MB	2.9 MB
10.0.0.198	7.6 MB	2.8 MB
10.0.0.47	303.4 MB	6.9 MB
Можно ли это всё сделать одним запросом и ещё и отсортировать по SUM( recv ) WHERE src_ip... что бы всё это работало пошустрее ?



Гость
1 - 29.03.2012 - 10:23
На первый взгляд можно.
Гость
2 - 29.03.2012 - 17:53
Нашёл сам решение:
Код:
SELECT src_ip, SUM(recv) AS sum1, SUM(sent) FROM packets WHERE DATE(ts) LIKE '$day' GROUP BY src_ip ORDER BY sum1 DESC
Выполняет за 3 секунды, то что первый вариант считал 25 секунд!
Гость
3 - 01.04.2012 - 15:00
Естественно :)
В первом варианте у тебя если несколько тысяч уникальных ip, то следующие запросы выполнялись в цикле - сами по себе они простые, но убийственные.
В итоговом варианте можно еще попробовать ускорить, заменив "DATE(ts) LIKE '$day' " на " ts = '2012-01-$day' " . Но это, конечно, зависит от формата ts. Если ts - это timestamp, то можно попробовать сделать выборку диапазоном ts>=минимальное_время AND ts<=максимальное_время
Ну и естественно на ts должен иметься индекс


К списку вопросов






Copyright ©, Все права защищены