Форум на Kuban.ru (http://forums.kuban.ru/)
-   Веб-дизайн и программирование (http://forums.kuban.ru/f1030/)
-   -   Помогите составить запрос SQL (http://forums.kuban.ru/f1030/pomogite_sostavit-_zapros_sql-2416037.html)

Agran 29.03.2012 07:41

Помогите составить запрос SQL
 
Слабо взадею SQL, но есть задача обработки большого количества данных. Есть большая база с логами прокси сервера.
Сейчас сервер думает перед выдачей пол минуты.
Код на Perl следующий:
[code] 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();
[/code]

Выводит следующую информацию:
[code]
Потребление за 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
[/code]

Можно ли это всё сделать одним запросом и ещё и отсортировать по SUM( recv ) WHERE src_ip... что бы всё это работало пошустрее ?

buh 29.03.2012 10:23

На первый взгляд можно.

Agran 29.03.2012 17:53

Нашёл сам решение:
[code]SELECT src_ip, SUM(recv) AS sum1, SUM(sent) FROM packets WHERE DATE(ts) LIKE '$day' GROUP BY src_ip ORDER BY sum1 DESC[/code]
Выполняет за 3 секунды, то что первый вариант считал 25 секунд!

lib 01.04.2012 15:00

Естественно :)
В первом варианте у тебя если несколько тысяч уникальных ip, то следующие запросы выполнялись в цикле - сами по себе они простые, но убийственные.
В итоговом варианте можно еще попробовать ускорить, заменив "DATE(ts) LIKE '$day' " на " ts = '2012-01-$day' " . Но это, конечно, зависит от формата ts. Если ts - это timestamp, то можно попробовать сделать выборку диапазоном ts>=минимальное_время AND ts<=максимальное_время
Ну и естественно на ts должен иметься индекс


Текущее время: 04:57. Часовой пояс GMT +3.