<div class="gmail_extra">Я Paginator::Lite использовал, работает.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Хочу только обратить внимание на возможную проблему производительности. Если у вас 1 млн элементов, которые вы разбиваете на 100 000 страниц по 10 элементов, то ваш сайтик может ощутимо тормозить за счет LIMIT-запросов. Эффективнее писать "Перейти к следующей/предыдущей странице", используя для выборки primary key или иное проиндексированное поле первого элемента выборки. Тогда ваши запросы превращаются в быстрые SELECT ... WHERE key >= $key LIMIT 10<br>
</div><div class="gmail_extra"><br></div><div class="gmail_extra">Кстати, может кто-нибудь пробовал оптимизировать такие запросы? Удавалось найти хорошее решение? Ну, например, если данные обновляются редко, можно раз в сутки рассчитывать по крону, на какой странице какие элементы отображать.</div>
<div class="gmail_extra"><br></div><div class="gmail_extra"><br><div class="gmail_quote">23 апреля 2012 г. 20:26 пользователь Alessandro Gorohovski <span dir="ltr"><<a href="mailto:angel@domashka.kiev.ua" target="_blank">angel@domashka.kiev.ua</a>></span> написал:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">oleg alexeenkov <<a href="mailto:proler@gmail.com" target="_blank">proler@gmail.com</a>> писал(а) в своём письме Mon, 23 Apr 2012 19:11:11 +0300:<div class="im">
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Alessandro Gorohovski <<a href="mailto:angel@domashka.kiev.ua" target="_blank">angel@domashka.kiev.ua</a>> писал(а) в своём письме Mon, 23 Apr 2012 19:58:41 +0400:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Andrew Shitov <<a href="mailto:andy@shitov.ru" target="_blank">andy@shitov.ru</a>> писал(а) в своём письме Mon, 23 Apr 2012 18:49:39 +0300:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<a href="http://search.cpan.org/search?query=pagination&mode=all" target="_blank">http://search.cpan.org/search?query=pagination&mode=all</a><br>
?<br>
</blockquote>
<br>
</blockquote></blockquote>
<br></div>
Олег,<br>
 Спасибо большое!<br>
:)<br>
<br>
Любопытный код. Буду ковыряться.<div class="HOEnZb"><div class="h5"><br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
[вброс] давным давно наковырял такую штуку, работает с миллиардами страниц 8) причем скорее всего путь перехода со страницы X на страницу Y будет наименьшим среди аналогов (особенно если подкрутить параметры)<br>
<br>
sub gotopage {<br>
   my ($fparam) = @_;<br>
   my (%ret);<br>
   #$fparam->{'total'} : total results, usually COUNT(*) as total<br>
   #-----------size -- : size of one page in rows (LIMIT x,size)<br>
   #current : current page number<br>
   #actual : usually $DBI::rows, if total unknown<br>
   #last : last page number (auto calculated from total/size if 0)<br>
   #total_max = 1000 : maximum db results<br>
   #printlog('dmp', 'gotopage start:', Dumper($fparam));<br>
   $fparam->{'size'} = 100 unless defined $fparam->{'size'};<br>
   return {} unless $fparam->{'size'};<br>
   $fparam->{'actual'} = $fparam->{'size'} unless defined $fparam->{'actual'};<br>
   $fparam->{'current'} ||= 1;<br>
   $fparam->{'last'} ||=<br>
     $fparam->{'size'} < 1<br>
     ? undef<br>
     : ( int( $fparam->{'total'} / ( $fparam->{'size'} || 1 ) ) + ( $fparam->{'total'} % ( $fparam->{'size'} || 1 ) ? 1 : 0 ) );<br>
   $fparam->{'buttonsb'} ||= $config{'gotopage_bb'} || 5;    #before<br>
   $fparam->{'buttonsa'} ||= $config{'gotopage_ba'} || 5;    #after<br>
   $fparam->{'align'}   = 1 unless defined $fparam->{'align'};<br>
   $fparam->{'jumpten'} = 1 unless defined $fparam->{'jumpten'};<br>
   $fparam->{'power'}   = 2 unless defined $fparam->{'power'};<br>
   my $fromto = sub {<br>
     my ($n) = @_;<br>
     return (<br>
       ( ( ( $n - 1 ) * $fparam->{'size'} ) + 1 ) . '-'<br>
         . (<br>
         ( $fparam->{'total'} and ( $fparam->{'total'} < $n * $fparam->{'size'} ) ) ? $fparam->{'total'} : $n * $fparam->{'size'}<br>
         )<br>
     );<br>
   };<br>
   my $align = sub {<br>
     my $a = int(shift);<br>
     my $len = shift || $fparam->{'align'};<br>
     substr( $a, $len, length($a) - $len ) = '0' x ( length($a) - $len ) if $len > 0 and length($a) > $len;<br>
     return $a;<br>
   };<br>
   #printlog('dmp', 'gotopage calc:'," <br\n/>" .Dumper($fparam) . "<br\n/>");<br>
   my $next = $fparam->{'actual'} >= $fparam->{'size'};<br>
   if ( ( !$fparam->{'total'} and $fparam->{'actual'} > 0 )<br>
     or $fparam->{'total'} >= $fparam->{'size'}<br>
     or $fparam->{'current'} > 1 )<br>
   {<br>
     $ret{'prev'}{ $fparam->{'current'} - 1 } = $fromto->( $fparam->{'current'} - 1 ) if $fparam->{'current'} > 1;<br>
     for my $n ( ( $fparam->{'current'} > $fparam->{'buttonsb'} ? $fparam->{'current'} - $fparam->{'buttonsb'} : 2 )<br>
       .. $fparam->{'current'} + ( $next ? $fparam->{'buttonsa'} : 0 ) )<br>
     {<br>
       last if $fparam->{'total'} and $n > $fparam->{'last'};<br>
       last if $fparam->{'total_max'} and $n * $fparam->{'size'} > $fparam->{'total_max'};<br>
       ( ( !$fparam->{'total'} and $n > $fparam->{'current'} + 1 ) ? ( \%{ $ret{'small'} } ) : ( \%{ $ret{'big'} } ) )->{$n} =<br>
         $fromto->($n);<br>
     }<br>
     if ( $fparam->{'jumpten'} ) {<br>
       $fparam->{'jumpfrom'} ||= '1' . ( 0 x ( length( $fparam->{'current'} - $fparam->{'buttonsb'} ) - 1 ) );<br>
       $fparam->{'jumpto'} ||= '1' . ( 0 x length( $fparam->{'current'} + $fparam->{'buttonsa'} ) );<br>
       $ret{'big'}{$_} = $fromto->($_)<br>
         for grep { !$fparam->{'last'} or $_ <= $fparam->{'last'} }<br>
         map { '1' . ( 0 x $_ ) } 1 .. length( $fparam->{'current'} ) - 1;<br>
       if ($next) {<br>
         $ret{'big'}{$_} = $fromto->($_)<br>
           for map { '1' . ( 0 x $_ ) } length( $fparam->{'current'} ) .. length( $fparam->{'last'} ) - 1;<br>
       }<br>
     }<br>
     $fparam->{'jumpfrom'} ||= 1;<br>
     $fparam->{'jumpto'}   ||= $fparam->{'last'};<br>
     #$fparam->{'jumpto'} = psmisc::min( $fparam->{'jumpto'}, $fparam->{'last'} );<br>
     $fparam->{'jumpto'} = $fparam->{'last'} if $fparam->{'last'} < $fparam->{'jumpto'};<br>
     if ( $fparam->{'power'} > 1 ) {<br>
       my ($n);<br>
       $n = $fparam->{'current'} - $fparam->{'buttonsb'} * $fparam->{'power'};<br>
       for (<br>
         $_ = $fparam->{'buttonsb'} ;<br>
         $fparam->{'jumpfrom'} >= 1 and $n > $fparam->{'jumpfrom'} and $n < $fparam->{'last'} ;<br>
         $n -= ( $_ *= $fparam->{'power'} )<br>
         )<br>
       {<br>
         $ret{'big'}{ $align->($n) } = $fromto->( $align->($n) );<br>
       }<br>
       $n = $fparam->{'current'} + $fparam->{'buttonsa'} * $fparam->{'power'};<br>
       for ( $_ = $fparam->{'buttonsa'} ; $next and $n < $fparam->{'jumpto'} ; $n += ( $_ *= $fparam->{'power'} ) ) {<br>
         $ret{'big'}{ $align->($n) } = $fromto->( $align->($n) );<br>
       }<br>
     }<br>
     $ret{'big'}{ $fparam->{'last'} } = $fromto->( $fparam->{'last'} ) if $fparam->{'last'} > 1 and $next;<br>
     $ret{'big'}{1} ||= $fromto->(1)<br>
       if ( $fparam->{'last'} > 1 or !$fparam->{'total'} )<br>
       and $fparam->{'actual'} >= $fparam->{'size'};<br>
     $ret{'next'}{ $fparam->{'current'} + 1 } = $fromto->( $fparam->{'current'} + 1 )<br>
       if $next and !$fparam->{'last'}<br>
         or $fparam->{'current'} < $fparam->{'last'};<br>
   }<br>
   #printlog('dmp', 'gotopage ret:', Dumper(\%ret));<br>
   return wantarray ? ( sort { $a <=> $b } keys %{ $ret{'big'} }, keys %{ $ret{'small'} } ) : \%ret;<br>
}<br>
</blockquote></div></div><div class="HOEnZb"><div class="h5">
-- <br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>С уважением, Александр<br>Личный блог: <a href="http://eax.me/" target="_blank">http://eax.me/</a><br>Мой форум: <a href="http://it-talk.org/" target="_blank">http://it-talk.org/</a><br>
Мой Twitter: <a href="http://twitter.com/afiskon" target="_blank">http://twitter.com/afiskon</a><br><br>
</div>