如果是我当然是选择直接对结果进行select xxx limit xx,xx
操作临时表不是多此一举嘛!
操作临时表不是多此一举嘛!
解决方案 »
- 还是那根据IP获取地址用正则切割问题
- 好技巧:eclipse for php 访问对象变量的自动代码提示
- 如何将从数据库取得的数据循环写入5个dl
- Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
- select中的option问题
- 使用crul抓取内容的时候。
- php新新手提问,分割出一条判断语句
- 这个语句怎么写
- 问一个问题,不知道能不能实现,请各位帮忙看看,谢谢~~~
- 寻找一个有关字符串的函数
- 关于数据库取结果的问题
- 怎么限制不让某一种文件上传?例如:扩展名为 .exe .php .asp的文件!
$PAGE_ROWS=18;//每页行数
$CONFIG->query = "select count(username) as total from users";
$result=db_query("select"); $totalrows=$result[0][total];
$size=$totalrows/$PAGE_ROWS;
if ($totalpages=="" and $inpage==""){
$totalpages=ceil($size);
$inpage="1";
}
//·­Ò³
$limit=($inpage-1)*$PAGE_ROWS.",".$PAGE_ROWS;
$CONFIG->query="select * from users order by username desc limit ".$limit;//这就是那条limit语句
$result=db_query("select");
$rows=count($result)-1;
for($i=0;$i<$rows;$i++){
输出数据
}<table border="0" bordercolorlight="#ffffff" bordercolordark="#ffffff" width="98%" cellpadding="0" cellspacing="1">
<tr>
<td>
<?phpif (($inpage!=1)&&($totalpages>1))
echo '<A href="'.$PHP_SELF.'?inpage='.($inpage-1).'&totalpages='.$totalpages.'"><font class="Fnt12px"><ÉÏÒ»Ò³</font></A> ';
else{
if ($totalpages<=1)
echo ' ';
else
echo '<font color="#A4A4A4" class="Fnt12px"><ÉÏÒ»Ò³</font> ';
}
for ($x=1;$x<=$totalpages;$x++)
{
if ($x==$inpage) if ($x==1 and $totalpages==1)
echo ' ';
else
echo '<font class="Fnt12pxR"><B>'.$x.'</B></font> ';
else
echo '<A href="'.$PHP_SELF.'?&inpage='.$x.'&totalpages='.$totalpages.'"><font class="Fnt12px">'.$x.'</font></A></A> ';
}
if (($inpage!=$totalpages)&&($totalpages>1))
echo '<A href="'.$PHP_SELF.'?inpage='.($inpage+1).'&totalpages='.$totalpages.'"><font class="Fnt12px">ÏÂÒ»Ò³></font></A> ';
else{
if ($totalpages<=1)
echo ' ';
else
echo '<font color="#A4A4A4" class="Fnt12px">ÏÂÒ»Ò³></font> ';
}echo ' ';
?>
</td>
</tr>
</table>
因为都要进行两次查询,一次统计记录数量,一次用于limit。这样肯定影响查询速度。这时候用临时表倒是一种方法。对于分页,我觉得下面这种方法最好.还适用于sqlserver
用mysql_data_seek+mysql_num_rows结合来分页,这点你应该懂吧
如果不用临时表,分页就很麻烦了.
因为不可能用一条select把6个表的数据选择起来.现在关键是怎样用这个临时表的问题而已.
到底是用系统自带的临时表还是自己做一个表当临时表用的问题.
我要搜索这些表的title,body字段,然后搜索出的title和这个文章所使用的url放在临时表中.
比如:
tblgeography中搜索到id为: 1,6,10,15...等表,
在tblhistory中搜索到id为: 2,6,14,15...等表.
则在临时表中存为:
title url
地理文章题目1 geography.php?id=1
地理文章题目6 geography.php?id=6
地理文章题目10 geography.php?id=10
地理文章题目15 geography.php?id=15
历史文章题目2 history?id=2
历史文章题目6 history?id=6
历史文章题目14 history?id=14
历史文章题目15 history?id=15注意:
我所说的临时表不一定是用create temporary table xxx所建立的临时表,也可以是一个普通的表,不过用来存放上面的数据.大家看看,如果用create temporary table xxx这种表存放搜索结果(或者用union组合多个查询结果),比如我一次搜索下来在6个表中共搜索出1000条记录,我要每页按20条记录分页显示这些数据,那么如果从第一页开始看到最后一页,对6个表的搜索以及建立这个临时表共要进行50次.因为temporary table在php程序结束后自动被drop.我搜索的东西1000条记录其实只有50条是有用被显示出来的...其中有多浪费大家可以衡量到...所以我想用一个普通的表来存放这些搜索结果,不过要加入些字段来判断这些搜索结果是属于哪次搜索的,比如使用session_id,time()的后6位数字就基本可以唯一标识某个用户的某次搜索的结果.
用这种方法,只要在搜索开始之前判断某次的搜索是否已经存在,如果是就可以直接用之前搜索的结果,那么按照上面的例子,那1000条记录只要搜索一次并且存入到这个"临时表"中,在按下一页、上一页这种的操作中就不需要再搜索那6个表了。其效率也应该有所提高。当然,在第二种方法中,“临时表”中的记录因为有多个用户同时使用的情况,而且还要不断把无用的搜索记录删除这类操作,所以肯定使用这个表比单单使用temporary table的要慢。而且我的这种关于效率的推断是基于用户对那1000个搜索结果每页都查看过的极限情况下推断出来的,因为在实际用的时候,用户基本不会把1000个搜索结果都看过,可能只会看其中的几页。显然如果用户只看这些搜索结果中的某几页时用temporary table的效率会比用第二种方法中的“临时表”效率要高。
所以这些东西要用经验去衡量其取舍关系,我想看看有没有人有使用过这类方法,看看他们的经验,比如用户查询到底一般只看几页呢还是一般都会看得比较多页等等。
关注!!!!!!
其实一般来说,用insert肯定比select要慢很多。
我测试过,用temporary table进行insert 200000条记录用了12秒。
而select这20w条记录要3-5秒.
mysql_pconnect("localhost","root");
mysql_select_db("jlong");
/*
$sql="drop table searchtmps";
mysql_query($sql);
$sql="
create table searchtmps(
sid varchar(31) NOT NULL,
time varchar(10) NOT NULL,
url VARCHAR(200) NOT NULL,
title VARCHAR(150) NOT NULL,
index(sid,time)
)";
$result=mysql_query($sql);
echo mysql_error()."<BR>";
*/session_start();
$sid=session_id();
$t1=time();
echo $t1."<br>";
flush;
$a=$t1%100000;
for($i=0;$i<=2500;$i++){
$sql="
insert into searchtmps
select '$sid','$a',concat('geography.php?id=',id),title from tblarea order by rand() limit 50
";
mysql_query($sql);
} // 在tblarea中随机插入200000记录.
$t2=time();
echo $t2."<br>";
echo ($t2-$t1)."<br>";$sql="select count(*) from searchtmps where sid='$sid' and time='$a'";
$result=mysql_query($sql);
echo mysql_result($result,0,0)."count time <br>";$sql="select * from searchtmps where sid='$sid' and time='$a'";
$result=mysql_query($sql);
$t3=time();
echo $t3."(search all timimg)<br>";
echo ($t3-$t2)."<br>";$sql="select * from searchtmps where sid='$sid' and time='$a' limit 10000,50";
$result=mysql_query($sql);
$t4=time();
echo $t4."(search 50recs timimg)<br>";
echo ($t4-$t3)."<br>";
?>具体测试结果是多少我忘记了。
limit......
目前我是选择了第二种方法先在网站上试用一阵先了。还有一个问题,我现在删除多余数据的方法是用于搜索的时候在搜索前有1%的机会删除time字段离现在超过600秒的数据。大家觉得这样好不好?
因为我自己测试过刷了N次还没等到这个1%的机会...