最后解决的方法是sql优化加缓存
优化步骤如下
1.采用纵向分表,将要查询的字段新建一张附加表_index,该表中的所有字段都经常用来查询的,如pid,uid,hard等,该表的id和主表的id是一样的,所有查询都在该表中进行
主表仅用于存储,数据库在查询定长字段是是非常快的,如int,menu,time,cha,一旦表中出现text等非定长字段就非常慢,
将查询从主表改为从附加表中查询后速度已经明显加快,再没出现过页面无法显示的问题.
2.进一步优化,查询,由于我的网站分页都是10条一分,当第一个用户访问时将查到的10条id和总页数再存入另一张表_list中,当第二个用户访问时再直接从_list中查询岂不更快,经过这两步的优化,网站速度已经有了质的飞跃,速度至少提升10倍以上,
3,缓存处理,做了缓存之后速度还能提升1倍
下面粘贴上部分代码
if(!$data['data']){//判断缓存是否存在
$urlstr=md5(__SELF__);//获取url的md5值
$listid=M("list");
$t=$listid->where("urlstr='{$urlstr}'")->find();//查找urlstr是否存在
if($t){//如果查到了urlstr,读取list数据表下的10个id和对应的总页数
import('ORG.Util.Page');//导入分页类
$count=$t['count'];
$data['count']=$count;
$id_10=$t['id_10'];
$p = new Page($count, 10);
$sql2="1=1 AND id in({$id_10})";
}else{//如果没有查到对应的urlstr,则从主表中读取10个id值,并写入list表中
$sql .= " AND is_check = 1";
$Form = M("questions_index");
import('ORG.Util.Page'); //导入分页类
$count = $Form->where($sql)->count(); //计算总数
$data['count']=$count;
$p = new Page($count, 10);
$q = M("questions_index")->where($sql)->order("id desc")-> limit($p->firstRow . ',' . $p->listRows)->select();
foreach($q as $k=>$v ){//得到10条id的字符串
$id_10[] = $v['id'];
}
$id_10=implode(",",$id_10);//将查到的id连接为字符串
//添加id10到list表中
$list['urlstr']=$urlstr;
$list['id_10']=$id_10;
$list['count']=$count;
$listid->add($list);
$sql2="1=1 AND id in({$id_10})";//sql2为查询questions
}
}总结:1.千万别从用于存储的表中查询,需要查询的尽量在附加表中
2.将第一次查到的值再存入另一张表(相当于用数据库缓存分页)
3.做到前两步时,缓存其实已经可以忽略了,但是依然能提升1倍左右的速度
最佳答案