千万级数据分页优化-1秒内处理完毕
来源:互联网 发布:反爆吧软件 编辑:程序博客网 时间:2024/05/22 00:24
2017-7-20更新
扩展:
用着这种方法可以做千万级的数据分页优化的,第二天我对数据库某张三千万数据的表进行测试,先查到有用的id或者uid,排序好,时间消耗第一次是0.7秒,接下来的是0.2-0.3秒,然后去做连表查询用where条件in(id/uid)这样几十条数据是0.1秒内可以拿到结果的,然后程序循环匹配数据,处理数据,0.1秒内,这样的思路,我目前测试到的三千万的分页在偏移量50W内,可以做到1S之内搞定,这种应该是比较容易实现的了吧
#今天大佬说有某个控制器在admin的机器上面经常打不不开,在线上服务器没问题,接到反馈后,查源码...#分析了一下,问题出在,循环查数据库上面,不用问了,这页面打开差不多10S,还有大量的没用数据load进来了#经过一番折腾,检查哪些关联条件没有索引,然后写出了第一种渣渣的方法,就是join,然后push上去,渣渣5.6秒吧,性能这么差,作为处女座的我怎么能忍,然后想起了limit偏移量大的优化问题,网上搜索一番,记得我之前的博客有过这类问题的文章,我一直觉得两年前自己写的UI很渣,就关闭了,找到了这个http://blog.csdn.net/chenyusbyongde/article/details/52954809帖子#...一段时间过去了....想起了我那牛逼的舍友,哈哈哈哈!!!#舍友说百万级的数据排序分页瓶颈在于join,一开始我还是半信半疑的,想了下之前的5W*5W的循环,那速真的有点慢...事实证明这个思路还是听准确的#1.先排序一个表,0.2S limit+order,取到合适条件的uid,然后根据uid in查找其他表的所需数据#2.数组循环嵌套循环,组装需要的数据,第二个循环符合条件就unset掉一个,break跳出,下次就可以减少一次循环#3.注意在count为空的时候,提示客户端,没有搜索到结果跳出去,不然下面的循环和sql in条件会为空报错的#ps.其实我废话几句sphinx等牛叉的搜索开源项目都是找uid返回uid给mysql,然后mysql根据索引in这样秒查的 /** yangxignyi openweixin666@126.com 2017-07-13 11:52 */ public function index() { $mix_search = trim(I('mix_search'));/*按照旧方法改的,性能还是太慢,30W条数据真的好慢,4-7秒 $count = M('ucenter_member u') ->join("join pay_personal_info p on u.id=p.uid") ->join("left join pay_stu s on u.id=s.uid") ->join("join pay_member m on u.id=m.uid") ->where($where) ->count(); $Page = new \Think\Page($count, 10); $list = M('ucenter_member u') ->join("join pay_personal_info p on u.id=p.uid") ->join("left join pay_stu s on u.id=s.uid") ->join("join pay_member m on u.id=m.uid") ->where($where) ->order("u.id desc") ->field ('u.id,u.username,u.score,u.reg_time,u.last_login_time,u.last_login_ip,m.status,m.nickname,m.login,p.credit_name') ->limit($Page->firstRow.','.$Page->listRows) ->select();*/ //处理搜索 if($mix_search){ if (is_numeric($mix_search)) { $tempwhere = " username =" . $mix_search; $search = M("ucenter_member")->where($tempwhere)->field("id")->find(); //如果根据条件搜索到就有搜索条件 $search['id'] = $search['id'] ? $search['id'] : '-9999'; $where = " uid = " . $search['id']; }else{ $where = " credit_name like '".$mix_search."%' "; } $count = M('personal_info')->where($where)->count(); }else{ $count = M('personal_info')->count(); } $count || $this->error("您的条件,没有搜索到数据!"); $Page = new \Think\Page($count, 10); $listTemp = M('personal_info') ->where($where) ->field("uid,credit_name") ->order("id desc") ->limit($Page->firstRow.','.$Page->listRows) ->select(); $ids=$list=[];//循环取出对应的uid foreach($listTemp as $v){ $ids[] = $v['uid']; } file_log("user-index",json_encode($ids)); $map['u.id'] = array('in',$ids); $info = M("ucenter_member u") ->join("left join pay_stu s on u.id=s.uid") ->join("join pay_member m on u.id=m.uid")->where($map) ->field('u.id,u.username,u.score,u.reg_time,u.last_login_time,u.last_login_ip,m.status,m.nickname,m.login') ->select(); foreach($listTemp as $v){ foreach($info as $kk=>$vv){ if($v['uid']==$vv['id']){ $v['id'] = $vv['id']; $v['username'] = $vv['username']; $v['score'] = $vv['score']; $v['reg_time'] = $vv['reg_time']; $v['last_login_time'] = $vv['last_login_time']; $v['last_login_ip'] = $vv['last_login_ip']; $v['status'] = $vv['status']; $v['nickname'] = $vv['nickname']; $v['login'] = $vv['login']; unset($vv[$kk]);break; } } $list[] = $v; } $Page->setConfig('theme', '%HEADER% %FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END%'); $Page->parameter = $mix_search; $show = $Page->show(); $this->assign('_list', $list); $this->assign('_page', $show); $this->meta_title = '用户信息'; $this->display(); }
阅读全文
0 0
- 千万级数据分页优化-1秒内处理完毕
- 千万级数据库查询+分页优化
- Mysql 千万级数据分页优化
- 千万级数据库分页优化
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案!
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案!
- MySQL处理千万级数据查询、分页
- MySQL处理千万级数据查询分页
- MySQL处理千万级数据查询、分页
- MySQL处理千万级数据查询分页
- MySQL处理千万级数据查询、分页
- MySQL处理千万级数据查询、分页
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案!(zz)
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案!(zz)
- 千万级数据量mssql分页查询优化和算法
- MySQL:MySQL处理千万级数据查询、分页
- 千万级数据分页实现
- 实现千万级数据的分页显示!
- GIT使用指南
- 【MyBatis学习02】走进MyBatis的世界
- 7.13 坑记录
- Android Studio com.android.support:percent 导入错误
- 获取当前日期至这一周的List
- 千万级数据分页优化-1秒内处理完毕
- 【题解】B-number
- PHP学习4
- 二分查找
- nginx做负载均衡的配置(简)
- eclipse 调试时出现!MESSAGE Could not find bundle: org.eclipse.equinox.console解决办法
- mybatis传入多个参数
- 德州仪器发布99%高效GaN逆变器功率级的参考设计
- JavaScript语言应用