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

来源:互联网 发布:bdu 大数据 编辑:程序博客网 时间:2024/05/16 18:59

大过年的无聊就做了个实验,因为这个问题一直在困扰我,分页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
原创粉丝点击