![]() |
Помогите составить запрос 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... что бы всё это работало пошустрее ? |
На первый взгляд можно. |
Нашёл сам решение: [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 секунд! |
Естественно :) В первом варианте у тебя если несколько тысяч уникальных ip, то следующие запросы выполнялись в цикле - сами по себе они простые, но убийственные. В итоговом варианте можно еще попробовать ускорить, заменив "DATE(ts) LIKE '$day' " на " ts = '2012-01-$day' " . Но это, конечно, зависит от формата ts. Если ts - это timestamp, то можно попробовать сделать выборку диапазоном ts>=минимальное_время AND ts<=максимальное_время Ну и естественно на ts должен иметься индекс |
Текущее время: 04:57. Часовой пояс GMT +3. |