不少人喜欢用ORDER BY RAND()随机调用,随机调用是最耗资源的一种调用方式,信息数在1万以上随机调用就开始影响速度。比like模糊匹配更占用资源!!!使用时建议慎之又慎。如果你能惹受乌龟爬的速度就当没说了!
如果确实要使用,可以参照帝国开发者王猛同志的逻辑思路:先用php随机出信息ID,然后SQL调用用id in (php随机的ID列表) 这样索引就能起到作用了!
那我们以文章表举例一下,调用举例:
<?php
$bid=$empire->fetch1("select id from {$dbtbpre}ecms_article order by id desc");
$randnum=10;//随机数量
$randids='';
$randdh='';
$minId=1;
$maxId=$bid['id'];
$idRange=range($minId,$maxId);//生成ID范围数组
shuffle($idRange);//随机打乱数组顺序
foreach($idRange as $randomId){
$randids.=$randdh.$randomId;
$randdh=',';
$randnum--;
if($randnum<=0){
break;
}
}
?>
[e:loop={'article',10,18,0,"id in ($randids)"}]
<a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a> <br>
[/e:loop]
由于数据删除那就会存在ID不连续的情况,这样就会导致随机的id可能不存在,调用少了!那就只能加大马力给服务器增加压力查询验证下随机出来的ID是否存在咯!代码如下:
<?php
$sid=$empire->fetch1("select id from {$dbtbpre}ecms_article order by id asc");
$bid=$empire->fetch1("select id from {$dbtbpre}ecms_article order by id desc");
$randnum=10;
$randids='';
$randdh='';
$possible_ids=range($sid['id'],$bid['id']);
shuffle($possible_ids);
foreach($possible_ids as $randomId){
$r = $empire->fetch1("select id from {$dbtbpre}ecms_article where id = $randomId");
if($r['id']){
$randids.=$randdh.$randomId;
$randdh=',';
$randnum--;
}
if($randnum<=0){
break;
}
}
?>
[e:loop={'article',10,18,0,"id in ($randids)"}]
<a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a> <br>
[/e:loop]
上面两种代码经过在本站文章数据表拥有将近12万篇文章的情况下!不管是静态生成还是动态浏览速度就大大的提高了!毕竟有充分利用到索引id字段。
当然也还有一种方法!敬请脑补!循环出来的ID转为数组在与文章表的数组进行去重后再合并数组在转为字符获得有用的随机ID!
不管哪种方法!帝国模板是支持PHP的,都可以借用memcached或者redis这样的内存把缓存时间设置长点!比如缓存一天的时间更能大大提高生成速度与动态速度!
总之:尽量不要用随机调用!这个确实是很浪费服务器资源!数据多会造成服务器资源耗尽!