实际案例:大数据的列表分页优化

浏览:3006 发布日期:2015/06/15 分类:技术分享 关键字: sql优化,案例分享
我的网站是个题库网站,在建设初期由于未考虑大数据量以后查询的速度问题,所以在后期表在达到80w行以后网站就明显变慢,由于所有试题都是存在一张表里,刚开始采用横向切割,还是没解决,由于使用的是阿里‘云数据库’,在升级数据库以后查询依然很慢,经常出现页面无法显示的问题,甚至在本地也是这样,问了很多人最后总结出优化方法只有三条,1.硬件升级,但依然是治标不治本,2.做缓存,3,sql优化
最后解决的方法是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倍左右的速度
最佳答案
评论() 相关
后面还有条评论,点击查看>>