大数据的话可以进行以下操作:
减少对数据库的读取,也就是减少调用数据库,
进行数据缓存,
利用数据库的自身优化技术,如索引等
精确查询条件,有利于提高查找速度
方法/步骤
首先要了解下分页的原理即
SELECT * FROM table ...... limit 开始位置 , 操作条数
开始位置从0开始
其次分页要用的公式
得到公式
(当前页数 - 1 )X 每页条数 , 每页条数
Select * from table limit ($Page- 1) * $PageSize, $PageSize
还要了解parse_url()解析URL函数
parse_url() 是讲URL解析成有固定键值的数组的函数
$ua=parse_url("");
print_r($ua);
结果:
Array
(
[scheme] = http
[host] = hostname
[user] = username
[pass] = password
[path] = /path
[query] = arg=value
[fragment] = anchor
)
创建数据库bbs和表test有
CREATE TABLE +test+ (
+id+ int(11) NOT NULL auto_increment,
PRIMARY KEY (+id+)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
然后插入十几条测试数据即可
写mysql数据库连接代码保存conn.php文件里
代码如下
php
$conn = @ mysql_connect("localhost", "root", "") or die("数据库链接错误");
mysql_select_db("bbs", $conn);
mysql_query("set names 'GBK'"); //使用GBK中文编码;
function htmtocode($content) {
$content = str_replace("\n", "br", str_replace(" ", " ", $content));
return $content;
}
//$content=str_replace("'","'",$content);
//htmlspecialchars();
写分页函数page.php
global $page, $firstcount, $pagenav, $_SERVER;
if (!$page)
$page = 1;
if (!$url) {
$url = $_SERVER["REQUEST_URI"];
//URL分析:
$parse_url = parse_url($url);
$url_query = $parse_url["query"]; //单独取出URL的查询字串
if ($url_query) {
$url_query = ereg_replace("(^|)page=$page", "", $url_query);
$url = str_replace($parse_url["query"], $url_query, $url);
if ($url_query)
$url .= "page";
else
} else {
$url .= "?page";
$page = min($lastpg, $page);
$prepg = $page -1; //上一页
$nextpg = ($page == $lastpg ? 0 : $page +1); //下一页
//开始分页导航条代码:
//如果只有一页则跳出函数:
if ($lastpg = 1)
return false;
$pagenav .= " a href='$url=1'首页/a ";
if ($prepg)
$pagenav .= " a href='$url=$prepg'前页/a ";
$pagenav .= " 前页 ";
if ($nextpg)
$pagenav .= " a href='$url=$nextpg'后页/a ";
$pagenav .= " 后页 ";
$pagenav .= " a href='$url=$lastpg'尾页/a ";
//下拉跳转列表,循环列出所有页码:
$pagenav .= " 到第 select name='topage' size='1' onchange='window.location=\"$url=\"+this.value'\n";
for ($i = 1; $i = $lastpg; $i++) {
if ($i == $page)
$pagenav .= "option value='$i' selected$i/option\n";
$pagenav .= "option value='$i'$i/option\n";
$pagenav .= "/select 页,共 $lastpg 页";
include("conn.php");
$result=mysql_query("SELECT * FROM +test+");
$total=mysql_num_rows($result);
echo $pagenav;
while($row=mysql_fetch_array($result)){
echo "hrb".$row[name]." | ".$row[sex];
调用数据和分页list.php
/**
* 爱微网
*/
$url=$_SERVER["REQUEST_URI"];
$url=parse_url($url);
$url=$url[path];
$numq=mysql_query("SELECT * FROM +test+");
$num = mysql_num_rows($numq);
if($_GET[page]){
$pageval=$_GET[page];
$page=($pageval-1)*$pagesize;
$page.=',';
if($num $pagesize){
if($pageval=1)$pageval=1;
echo "共 $num 条".
" a href=$url?page=".($pageval-1)."上一页/a a href=$url?page=".($pageval+1)."下一页/a";
echo $SQL="SELECT * FROM +test+ limit $page $pagesize ";
$query=mysql_query($SQL);
while($row=mysql_fetch_array($query)){
注意事项
注意分页公式写法你只要记住即可;
(当前页数 - 1 )X 每页条数 , 每页条数;
Select * from table limit ($Page- 1) * $PageSize, $PageSize;
注意三个代码文件在同一个目录下;
主要是最后的list.php调用代码要细看很有用.
方法如下:
$arr_click = array(
);
$newarr = array_slice($arr_click, ($page-1)*$indexinpage, $indexinpage);
原理如下:
和分页原理一样
数组用 array_slice(array,offset,length) 函数在数组中根据条件取出一段值.
array:需要处理的数组
offset:取出元素的开始位置
length:返回数组的长度
在每页中改变 offset 的值就行了!
PHP代码如下:
/*
Author:默默
$num=10; //每页显示10条数据
$db=mysql_connect("host","name","pass"); //创建数据库连接
$select=mysql_select_db("db",$db); //选择要操作的数据库
首先咱们要获取数据库中到底有多少数据,才能判断具体要分多少页,具体的公式就是
总数据数除以每页显示的条数,有余进一.
$total=mysql_num_rows(mysql_query("select id from table")); //查询数据的总数,id是数据库中的一个自动赋值的字段
$pagenum=ceil($total/$num); //获得总页数
//假如传入的页数参数大于总页数,则显示错误信息
If($page$pagenum || $page == 0){
Echo "Error : Can Not Found The page .";
Exit;
$info=mysql_query("select name from table limit $offset,$num"); //获取相应页数所需要显示的数据,name是数据里的一个字段
While($it=mysql_fetch_array($info)){
Echo $it['name']."
";
} //显示数据
For($i=1;$i=$pagenum;$i++){
$show=($i!=$page)?"$i":"$i";
Echo $show." ";
/*显示分页信息,假如是当页则显示粗体的数字,其余的页数则为超连接,假如当前为第三页则显示如下
很多应用往往只展示最新或最热门的几条记录,但为了旧记录仍然可访问,所以就需要个分页的导航栏.然而,如何通过MySQL更好的实现分页,始终是比较令人头疼的问题.虽然没有拿来就能用的解决办法,但了解数据库的底层或多或少有助于优化分页查询.
我们先从一个常用但性能很差的查询来看一看.
SELECT *
FROM city
ORDER BY id DESC
CREATE TABLE city (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id)
) ENGINE=InnoDB;
真正的问题在于offset(分页偏移量)很大的时候,像下面这样:
对于分页请求,还有一个信息也很重要,就是总共的记录数.我们可以通过下面的查询很容易的获取总的记录数.
SELECT COUNT(*)
FROM city;
SELECT SQL_CALC_FOUND_ROWS *
下面来看看到底如何优化.文章分为两部分,第一部分是如何获取记录的总数目,第二部分是获取真正的记录.
高效的计算行数
如果采用的引擎是MyISAM,可以直接执行COUNT(*)去获取行数即可.相似的,在堆表中也会将行数存储到表的元信息中.但如果引擎是InnoDB情况就会复杂一些,因为InnoDB不保存表的具体行数.
我们可以将行数缓存起来,然后可以通过一个守护进程定期更新或者用户的某些操作导致缓存失效时,执行下面的语句:
USE INDEX(PRIMARY);
获取记录
下面进入这篇文章最重要的部分,获取分页要展示的记录.上面已经说过了,大的偏移量会影响性能,所以我们要重写查询语句.为了演示,我们创建一个新的表"news",按照时事性排序(最新发布的在最前面),实现一个高性能的分页.为了简单,我们就假设最新发布的新闻的Id也是最大的.
CREATE TABLE news(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
一个比较高效的方式是基于用户展示的最后一个新闻Id.查询下一页的语句如下,需要传入当前页面展示的最后一个Id.
FROM news WHERE id $last_id
LIMIT $perpage
查询上一页的语句类似,只不过需要传入当前页的第一个Id,并且要逆序.
ORDER BY id ASC
上面的查询方式适合实现简易的分页,即不显示具体的页数导航,只显示"上一页"和"下一页",例如博客中页脚显示"上一页","下一页"的按钮.但如果要实现真正的页面导航还是很难的,下面看看另一种方式.
SELECT id
FROM (
SELECT id, ((@cnt:= @cnt + 1) + $perpage - 1) % $perpage cnt
FROM news
JOIN (SELECT @cnt:= 0)T
WHERE id $last_id
LIMIT $perpage * $buttons
)C
WHERE cnt = 0;
通过上面的语句可以为每一个分页的按钮计算出一个offset对应的id.这种方法还有一个好处.假设,网站上正在发布一片新的文章,那么所有文章的位置都会往后移一位,所以如果用户在发布文章时换页,那么他会看见一篇文章两次.如果固定了每个按钮的offset Id,这个问题就迎刃而解了.Mark Callaghan发表过一篇类似的博客,利用了组合索引和两个位置变量,但是基本思想是一致的.
如果表中的记录很少被删除、修改,还可以将记录对应的页码存储到表中,并在该列上创建合适的索引.采用这种方式,当新增一个记录的时候,需要执行下面的查询重新生成对应的页号.
SET p:= 0;
UPDATE news SET page=CEIL((p:= p + 1) / $perpage) ORDER BY id DESC;
当然,也可以新增一个专用于分页的表,可以用个后台程序来维护.
UPDATE pagination T
JOIN (
SELECT id, CEIL((p:= p + 1) / $perpage) page
ORDER BY id
ON C.id = T.id
SET T.page = C.page;
现在想获取任意一页的元素就很简单了:
FROM news A
JOIN pagination B ON A.id=B.ID
WHERE page=$offset;
CREATE TEMPORARY TABLE _tmp (KEY SORT(random))
ALTER TABLE _tmp ADD OFFSET INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, DROP INDEX SORT,ORDER BY random;
此时此刻呢就可以向下面一样执行分页查询了.
FROM _tmp
WHERE OFFSET = $offset
ORDER BY OFFSET
LIMIT $perpage;
简单来说,对于分页的优化就是...避免数据量大时扫描过多的记录.
以上就是土嘎嘎小编为大家整理的php大数据分页处理相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!