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