php+mysql查询上万条数据很慢,其中把分页去掉就快了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php+mysql查询上万条数据很慢,其中把分页去掉就快了相关的知识,希望对你有一定的参考价值。

情况:

表中有上万条数据,我需要做个list,列出数据,其中利用分页显示。

我测试的结果是,不加下面的分页,速度很快,加上分页,就很慢。

我分析就是因为分页那里的问题。

我把分页函数放上来大家帮我看一下。

分页函数:

// ####################### 分页函数 #######################
function multi_php($num, $perpage, $curr_page, $mpurl, $type)
$multipage = '';
if($num > $perpage)
$page = 20;
$offset = 2;

$pages = ceil($num / $perpage);
$from = $curr_page - $offset;
$to = $curr_page + $page - $offset - 1;
if($page > $pages)
$from = 1;
$to = $pages;
else
if($from < 1)
$to = $curr_page + 1 - $from;
$from = 1;
if(($to - $from) < $page && ($to - $from) < $pages)
$to = $page;

elseif($to > $pages)
$from = $curr_page - $pages + $to;
$to = $pages;
if(($to - $from) < $page && ($to - $from) < $pages)
$from = $pages - $page + 1;



if ($type == html)
$multipage .= "<a href=\"".$mpurl.".html\"><Font face=webdings>9</font></a> ";
else
$multipage .= "<a href=\"$mpurl&page=1\"><Font face=webdings>9</font></a> ";

for($i = $from; $i <= $to; $i++)
if($i != $curr_page)
if ($type == html)
$multipage .=($i==1)? "<a href=\"".$mpurl.".html\">$i</a> ":"<a href=\"".$mpurl."&page=$i\">$i</a> ";
else
$multipage .= "<a href=\"$mpurl&page=$i\">$i</a> ";

else
$multipage .= '<u><b>'.$i.'</b></u> ';


if ($type == html)
$multipage .= $pages > $page ? " ... <a href=\"".$mpurl."&page=$pages\"> $pages <Font face=webdings>:</font></a>" : " <a href=\"".$mpurl."&page=$pages\"><Font face=webdings>:</font></a>";
else
$multipage .= $pages > $page ? " ... <a href=\"$mpurl&page=$pages\"> $pages <Font face=webdings>:</font></a>" : " <a href=\"$mpurl&page=$pages\"><Font face=webdings>:</font></a>";

$multipage.=" <select size=1 onchange=\"javascript:window.location.href=''+this.options[this.selectedIndex].value+''\">";
$i=1;
for($i=1;$i<=$pages;$i++)

$value = $i==1 ? $mpurl:$mpurl."&page=".$i;
$i == $page ? $multipage.="<option value=".$value." selected>No. ".$i." Page</option>" : $multipage .= "<option value=".$value.">No. ".$i." Page</option>";

$multipage.="</select>";

return $multipage;


看看能不能该函数解决问题,或者,分页怎么做比较合适!!??

参考技术A 你的这个分页函数是全部查完之后再每次显示一页,还是每次只查询一页的数据 参考技术B /**
* 分页函数
*
* @access public
*
* @param int $num 总数
* @param int $perpage 每页数目
* @param int $curpage 当前页
* @param bool $append 是否附加省略号
*
* @return string
*/
function multipage($num, $perpage, $curpage, $maxpages = 0, $page = 10, $simple = 0, $onclick = '')

$multipage = '';
$onclick = $onclick ? ' onclick="'.$onclick.'(event)"' : '';
//url处理
$mpurl = $_SERVER['PHP_SELF'];
if(isset($_SERVER['QUERY_STRING']))

$mpurl .= '?' . preg_replace('/&page=[0-9]*/','',$_SERVER['QUERY_STRING']) . '&';

if($num > $perpage)
$offset = 2;

$realpages = @ceil($num / $perpage);
$pages = $maxpages && $maxpages < $realpages ? $maxpages : $realpages;

if($page > $pages)
$from = 1;
$to = $pages;
else
$from = $curpage - $offset;
$to = $from + $page - 1;
if($from < 1)
$to = $curpage + 1 - $from;
$from = 1;
if($to - $from < $page)
$to = $page;

elseif($to > $pages)
$from = $pages - $page + 1;
$to = $pages;



$multipage = ($curpage - $offset > 1 && $pages > $page ? '[<a href="'.$mpurl.'page=1" class="p_redirect"'.$onclick.'>‹</a>]' : '').
($curpage > 1 && !$simple ? '[<a href="'.$mpurl.'page='.($curpage - 1).'" class="p_redirect">上一页</a>] ' : '');
for($i = $from; $i <= $to; $i++)
$multipage .= $i == $curpage ? '[<a class="p_curpage">'.$i.'</a>]' :
'[<a href="'.$mpurl.'page='.$i.'" class="p_num"'.$onclick.'>'.$i.'</a>]';


$multipage .= ($curpage < $pages && !$simple ? ' [<a href="'.$mpurl.'page='.($curpage + 1).'" class="p_redirect"'.$onclick.'>下一页</a>]' : '').
($to < $pages ? '[<a href="'.$mpurl.'page='.$pages.'" class="p_redirect"'.$onclick.'>›</a>]' : '').
(!$simple && $pages > $page ? '<a class="p_pages" style="padding: 0px"><input class="p_input" type="text" name="custompage" onKeyDown="if(event.keyCode==13) window.location=\''.$mpurl.'page=\'+this.value; return false;"></a>' : '');

$multipage = $multipage ? '<div class="p_bar">'.(!$simple ? '<a class="p_total"> 共'.$num.'条记录 </a><a class="p_pages"> '.$curpage.'/'.$realpages.'页 </a>' : '').$multipage.'</div>' : '';

return $multipage;


示例:
$page = intval( isset($_GET['page']) ? $_GET['page'] : 1 );
$perpage = intval( isset($_GET['perpage']) ? $_GET['perpage'] : 18 );
if($page > 0)
$startlimit = ($page - 1) * $perpage;
else
$startlimit = 0;


$sql = "SELECT COUNT(id) AS countnum FROM $tableprearticle WHERE moduleid = $module_id";
$log = $db->fetch_one_array($sql);
$total = $log['countnum'];
$result = $db->query("SELECT * FROM $tableprearticle WHERE moduleid = $module_id ORDER BY listnum,id DESC LIMIT $startlimit,$perpage");
$article = array();
while($data = $db->fetch_array($result))
$data['addtime'] = gmdate('Y-n-j H:i',$data['addtime']);
$article[] = $data;

$page_control = multipage($total,$perpage,$page);

sqlserver分页去重失效

sqlserver分页去重失效的原因可能是:

1. 查询语句中没有使用distinct关键字,导致查询结果中出现重复记录。

2. 查询语句中没有使用order by子句,导致查询结果中出现重复记录。

3. 查询语句中没有使用group by子句,导致查询结果中出现重复记录。

4. 查询语句中没有使用top子句,导致查询结果中出现重复记录。
参考技术A 首先,你可以尝试更改分页的排序,确保在查询中包括要去重的字段,这可能会提高去重效率,来满足需求。如果仍然不行,你可以考虑使用temp table或者CTE(递归查询表达式),手动去重后再进行分页。
首先,你可以尝试更改分页的排序,确保在查询中包括要去重的字段,这可能会提高去重效率,来满足需求。如果仍然不行,你可以考虑使用temp table或者CTE(递归查询表达式),手动去重后再进行分页。
参考技术B 造成分页查询数据重复出现的原因是:在数据中,排序列值的不唯一性

解决方法如下(两个条件必须同时满足):
  1.sql语句中需要有排序条件。
  2.排序条件如果没有唯一性,那么必须在后边跟上一个唯一性的条件,比如主键(也可以使用rowid)。

备注:oracle默认采用rowid排序方式,所以我们只要在原来的排序规则后再加上rowid排序即可,同时也不会造成额外的性能损耗。
参考技术C 分页去重可能会失效,因为如果不对分页中的每一行进行排序,很有可能会遗漏某些结果。 为了有效地实现去重,你可以使用ROW_NUMBER()函数来排除重复记录并正确地实现分页结果。 参考技术D SQL Server 分页查询时,如果不加上distinct去重,会出现重复数据,可以在查询语句中加上distinct关键字来去重,以解决分页查询时重复数据的问题。

以上是关于php+mysql查询上万条数据很慢,其中把分页去掉就快了的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver分页去重失效

MySQL分页查询

MySQL分页查询优化

MySQL分页查询优化

MySQL分页查询性能优化

数据量很大,分页查询很慢,优化方案