其实分页一般要查询两次数据库.一是记录的总数,一是用limit语句来取记录.
百万行的数据,用limit语句取出几十条数据也是很快的.
如果楼主想要更快的速度的话,可以考虑将数据分开保存.
下面提供一个分页的函数.function _setPage($baseUrl, $total, $start, $limit, $parm="", $top = 0)
{
if($total != 0) $pages = $total/$limit; else $pages = 0;
if(empty($start)) $start=0;
if(empty($limit)) $limit=20;
if($start>$total)$start=$total-$limit;
if($start<0) $start=0;
if($limit<0) $limit=0;
if($limit>100) $limit=100;
//$start = $start - $top;
$showpage = 10;
$currentpage=$start/$limit;
if($currentpage<5){
$pageno=0;
$i=0;
} else{
if($currentpage+10 > $total/$limit ){
$pageno=$currentpage -5;
}else{
$pageno=$currentpage - 5;
}
$i=$pageno*$limit;
}
if($total==0) $currentpage = -1;
$strPage = "总[" . ($currentpage + 1) . "/" . ceil($pages) . "]页 ";
$page=0;
$strPage .= ""; if($start/$limit > $showpage)
{
$tmp = ($pageno - 1)* $limit;
$strPage.= "<a href='$baseUrl&$parm&start=".($tmp)."&limit=$limit'><<</a>";
}
while($i < $total)
{
if($start/$limit ==$pageno)
{
$strPage .= "<font color=red>". ($pageno + 1) ." </font>";
}
else
{
$strPage .= "<a href='$baseUrl&$parm&start=".($pageno*$limit)."&limit=$limit'>".($pageno + 1)."</a> ";
}
$pageno++;
$page++;
$i+=$limit; if($page > $showpage)
{
$strPage.= "<a href='$baseUrl&$parm&start=".($pageno*$limit)."&limit=$limit'>>></a>";
break;
}
}
if($start>0){
$strPage .= " <a href='$baseUrl?$parm&start=0&limit=$limit'>首页</a> ";
}else{
$strPage .= " 首页 ";
} if($start>0){
$strPage .= " <a href='$baseUrl&$parm&start=".($start-$limit)."&limit=$limit'>上一页</a> ";
}
if($start+$limit< $total){
$strPage .= " <a href='$baseUrl&$parm&start=".($start+$limit)."&limit=$limit' >下一页</a> ";
} if($start+$limit< $total){
$strPage .= " <a href='$baseUrl&$parm&start=".($total- $total%$limit)."&limit=$limit'>尾页</a> ";
}else{
$strPage .= " 尾页 ";
}
return $strPage;
}
//调用
$strPage = _setPage("index.php?m=message&a=list", $total, $start, 10);
百万行的数据,用limit语句取出几十条数据也是很快的.
如果楼主想要更快的速度的话,可以考虑将数据分开保存.
下面提供一个分页的函数.function _setPage($baseUrl, $total, $start, $limit, $parm="", $top = 0)
{
if($total != 0) $pages = $total/$limit; else $pages = 0;
if(empty($start)) $start=0;
if(empty($limit)) $limit=20;
if($start>$total)$start=$total-$limit;
if($start<0) $start=0;
if($limit<0) $limit=0;
if($limit>100) $limit=100;
//$start = $start - $top;
$showpage = 10;
$currentpage=$start/$limit;
if($currentpage<5){
$pageno=0;
$i=0;
} else{
if($currentpage+10 > $total/$limit ){
$pageno=$currentpage -5;
}else{
$pageno=$currentpage - 5;
}
$i=$pageno*$limit;
}
if($total==0) $currentpage = -1;
$strPage = "总[" . ($currentpage + 1) . "/" . ceil($pages) . "]页 ";
$page=0;
$strPage .= ""; if($start/$limit > $showpage)
{
$tmp = ($pageno - 1)* $limit;
$strPage.= "<a href='$baseUrl&$parm&start=".($tmp)."&limit=$limit'><<</a>";
}
while($i < $total)
{
if($start/$limit ==$pageno)
{
$strPage .= "<font color=red>". ($pageno + 1) ." </font>";
}
else
{
$strPage .= "<a href='$baseUrl&$parm&start=".($pageno*$limit)."&limit=$limit'>".($pageno + 1)."</a> ";
}
$pageno++;
$page++;
$i+=$limit; if($page > $showpage)
{
$strPage.= "<a href='$baseUrl&$parm&start=".($pageno*$limit)."&limit=$limit'>>></a>";
break;
}
}
if($start>0){
$strPage .= " <a href='$baseUrl?$parm&start=0&limit=$limit'>首页</a> ";
}else{
$strPage .= " 首页 ";
} if($start>0){
$strPage .= " <a href='$baseUrl&$parm&start=".($start-$limit)."&limit=$limit'>上一页</a> ";
}
if($start+$limit< $total){
$strPage .= " <a href='$baseUrl&$parm&start=".($start+$limit)."&limit=$limit' >下一页</a> ";
} if($start+$limit< $total){
$strPage .= " <a href='$baseUrl&$parm&start=".($total- $total%$limit)."&limit=$limit'>尾页</a> ";
}else{
$strPage .= " 尾页 ";
}
return $strPage;
}
//调用
$strPage = _setPage("index.php?m=message&a=list", $total, $start, 10);
CakePHP和ZF里面的分页支持都比较好!
另外一点,分页其中最慢的一点就是在取记录的总数上,因为要算出总的页数,楼主可以考虑下不用算总页数,只显示下一页,如每页20个,当用limit取出的记录数小于20时,则动态判断这就是最后一页,这样做的好处是不再需要取总数,少一次最关建性的数据库查询,速度上将会提高不少.但不好的地方就是没有最后一页和总页数,其实也可以加最后一页,就是按默认排序倒过来前20个,也算是最后一页吧,