php分页和数据表字段设计注意事项

大过年的无聊就做了个实验,因为这个问题一直在困扰我,分页SQL语句如何写才能对网站的访问速度最优。
1.两表关联
2.先读主表,再循环读从表信息
有多人和我说过其中某个好,每个人说的貌似都很有理有据,这让我一度十分迷惑,所以才有了今天的实验
首先我们先间两张简单表格,usersgrade 分别对应着用户和成绩,用户id和用户名,数据量1亿+,成绩是用户3倍的数据,用户表数据总数如下图
这里写图片描述

首先我们来看一下关联数据表,模拟一页15条数据

<?php 
$sql = 'select * from `grade` as p1 left join `users` as p2 on p1.uid = p2.id where p1.`name` = \'数学\' order by p1.id DESC limit 15';
$res = mysql_query($sql);
while($one = mysql_fetch_assoc($res))
{
    print_r($one);
}
?>

运行结果,如下图显示
这里写图片描述

下面分开读取,因为需要从表的条件,所以我先读取从表再去读主表数据,这里平时可以根据自己实际情况设计代码

<?php 
$sql = 'select * from `grade` as p1 where p1.`name` = \'数学\' order by p1.id DESC limit 15';
$res = mysql_query($sql);
while($one = mysql_fetch_assoc($res))
{
    print_r($one);
    $sql1 = 'select * from `users` where id = '.$one['uid'];
    $res1 = mysql_query($sql1);
    $one1 = mysql_fetch_assoc($res1);
    print_r($one1);
}
?>

运行结果,如下图显示
这里写图片描述

从图上看,貌似分开写好像快一点,当然这点我们可以忽略,实际项目中加上一些逻辑处理,这种差别根本就不是区别,也就是说到现在为止,两种方法其实并没有太多区别。
那么我们来更加真实的模仿,加上求数据总数,这个是分页总个数计算的必要数据
首先我们还是模拟关联数据表,代码如下

<?php
$sql = 'select * from `grade` as p1 left join `users` as p2 on p1.uid = p2.id where p1.`name` = \'数学\' order by p1.id DESC limit 15';
$res = mysql_query($sql);
while($one = mysql_fetch_assoc($res))
{
    print_r($one);
}
$sql1 = 'select count(p1.id) from `grade` as p1 left join `users` as p2 on p1.uid = p2.id where p1.`name` = \'数学\' ';
$res1 = mysql_query($sql1);
$one1 = mysql_fetch_assoc($res1);
?>

来让我们看看结果如何,额,这样的结果,估计会被打死,8分钟啊,这要多好的耐心,多么忠实的粉啊
这里写图片描述

下面再看一下分开读取的结果

<?php 
$sql = 'select * from `grade` as p1 where p1.`name` = \'数学\' order by p1.id DESC limit 15';
$res = mysql_query($sql);
while($one = mysql_fetch_assoc($res))
{
    print_r($one);
    $sql1 = 'select * from `users` where id = '.$one['uid'];
    $res1 = mysql_query($sql1);
    $one1 = mysql_fetch_assoc($res1);
    print_r($one1);
}

$sql1 = 'select count(id) from `grade` where `name` = \'数学\'';
$res1 = mysql_query($sql1);
$one1 = mysql_fetch_assoc($res1);
?>

虽然说这个速度也会被打死,不过要比之前好的多
这里写图片描述

从结果上看,分开读要比关联数据表更快,其实这里偷换了一个概念,我们在获取页面数据总数的时候前者是读取了两张表,后者只是一张,这个和Mysql的执行过程有关系,前者是先做了数据表关联,再求出总数,后者只是单一表的总数,所以速度上会快很多,所以在这里,我想说的是,对于页面的15条数据的读取方式差别不大,重点在于求分页总数上,关联表的速度会比单一表慢很多,为了避免这一情况,我们再设计数据表时,应充分考虑到字段和表的关系,将用于搜索的字段尽可能的放到一张表中。

最后在推荐一篇文章MySQL如何执行关联查询

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值