php+mysql 大容量数据高效分页效果(弃用limit)
发现当表中有很多上万条数据时,越后的数据用limit分页显示就越慢(>2秒),可能是mysql的特性所致。所以花了点时间总结实现了更优解决方案,最终实现毫秒级响应。若网友有更优的,请留言,谢谢!
<?
/*
高效分页效果:
特点及优点:
1.不使用limit,当总记录数很大时,limit取后面的数据会很慢
2.保存主键值至数组,再截取最终需要的一段主键值,再放入sql in中,减少了数据库的负担。
步骤:
1.先取出所有记录的主键id值
2.保存id值入数组
3.根据当前页、每页数据量,获取需要返回记录的id串 ;implode(",",array_slice($conndb_arr,($page-1)*$page_size,$page_size));array_slice取出数组中的一段,implode组合数组为字符串
4.构造最终的sql语句 "$sql where id in(".implode(",",array_slice($conndb_arr,($page-1)*$page_size,$page_size)).")"
例子如下:
*/
if(isset($_GET["page"]))$page = intval($_GET["page"]);else $page = 1; //取出当前所在页,默认为1
$page_size =9; // 每页显示记录数
//完整的查询
$sql="select id,title,addtime,visit,content,(select count(*) from blog_news where archive_id=blog_archive.id) as news_c,(select realname from users where id=blog_archive.users_id) as creator from blog_archive";
$sql_c="select id from blog_archive order by id desc";// 取出表所有id值 (强烈建议id为主键或已添加索引)
$result=conndb($sql_c);
if(getresult_right($result)){ //自定义的sql语句执行结果判断语句
$amount=mysql_num_rows($result);//得到总记录数
//$row =mysql_fetch_array($result);
while ($row =mysql_fetch_array($result)){
$conndb_arr[]=$row[0];//将所有id值存入数组
}
// 记算总共有多少页
if( $amount ){
if( $amount < $page_size ){ $page_count = 1; } //如果总数据量小于$PageSize,那么只有一页
if( $amount % $page_size ){ //取总数据量除以每页数的余数
$page_count = (int)($amount / $page_size) + 1; //如果有余数,则页数等于总数据量除以每页数的结果取整再加一
}else{
$page_count = $amount / $page_size ; //如果没有余数,则页数等于总数据量除以每页数的结果
}
} else $page_count = 0;
if($page>$page_count)$page=(int)$page_count;
if( $amount ){
//array_slice($conndb_arr,($page-1)*$page_size,$page_size)表示取出id数组中的一段,从($page-1)*$page_size开始取$page_size个
$result=conndb("$sql where id in(".implode(",",array_slice($conndb_arr,($page-1)*$page_size,$page_size)).")");
while ($row =mysql_fetch_array($result)){ //循环输出分页记录
echo $row[id]."<br>";
}
}else{
echo "没有找到任何记录!";
}
}
?>

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
8本好书上新:越忙越要多读书
知乎上有人问:"读书的意义是什么?”有一个高赞回复,吕秀才说:“起初我读书是为了功名,后来读着读着心里就没底了,那么多书,冲动,冲动到后来吧,突然就反应过来了,怎么说呢,就拿交朋友来说用的是心,他不是用学问,咱们读书不是为了去炫耀,而是为了更好的沟通。” 互联网发展日新月异,互联网人时刻都有充电提高的需求,程序员读新书更是为了提升专业技能。2月小编带来8本好书,包含了Linux、Python、机器学习、算法、C++、Web开发等等。才越忙越要多读书,充实你的人生。 开学季不仅有好书,优惠是少不了的,异步社区全场(纸书、电子书、视频课程)最高立减50元。 , 先来看看2月上新好书吧,先选书再下单。 《奔跑吧linux内核》作者:张天飞ISBN 978-7-115-50226-1/ 扫描二维码,一键购买 《奔跑吧 Linux内核》作者又一力作,内含70余个创新实验,配套视频+教学PPT,带你轻松入门Linux内核开发! 原理+基础,从调试Linux内核到动手编写一个简单的内核模块,真正从零开始学习Linux内核。 实验+案例,70余个创新实验贯穿全书,与你分享业内一线项目经验。...
- 下一篇
Python 之网络式编程
Python 之网络式编程 一客户端/服务器架构 即C/S架构,包括 1、硬件C/S架构(打印机) 2、软件B/S架构(web服务) C/S架构与Socket的关系: 我们学习Socket就是为了完成C/S的开发 二 OSI七层 引子: 计算机组成原理:硬件、操作系统、应用软件三者组成。 具备以上条件后,计算机就可以工作,如果你要和别人一起玩,那你就需要上网了。互联网的核心就是由一堆协议组成,协议就是标准。 为什么学习Socket之前要先了解互联网协议? 1、C/S架构的软件(应用软件属于应用层)是基于网络进行通信的 2、网络的核心即一堆协议,协议即标准,想开发一款基于网络通信的软件,就必须遵循这些标准 OSI七层: 三 Socket层 四 Socket是什么 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,在设计模式中,Socket其实就是一个门面模式,它把负责的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 所以,我们无需深入学习理解TCP/UDP协议,Socket已经为我...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS6,CentOS7官方镜像安装Oracle11G
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS8编译安装MySQL8.0.19