前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >rand()随机的效率问题

rand()随机的效率问题

作者头像
世纪访客
发布2018-08-02 15:36:22
6640
发布2018-08-02 15:36:22
举报
文章被收录于专栏:西枫里博客

在平时开发过程中,数据量不超过1W条的,通常执行随机查询是通过对order进行rand操作的进行的。但是随着数据量的增加,rand严重制约了整站的访问速度。

这是什么原因造成的呢?mysql官方的说话是rand函数在order中会被反复扫描多次,造成性能急剧下降。

网友的的解决办法最多的就是通过对min和max之间的ID进行随机,这样就存在一个问题,如果是自增主键,那么某条数据被删除,那么就可能随机到一条已经被删除的内容,展现出来的时候就达不到预期的效果。

我的解决办法是先索引所有有效内容的ID,这个查询很快。迅速完成,即使数据量在百万级。得到的ID数组,经过遍历后将原数组转换成一个键名和键值相同的数组。使用array_rand函数随机产生需要的键名,再通过键名去查询数据库。这样通过有限的查询获得100%存在的数据。

代码:

代码语言:javascript
复制
$map['art_status']=['=',0];//文章状态为发布
        $art=Db::name('article')->field('id')->where($map)->select();
            foreach ($art as $key => $value) {
                $arr[$value['id']]=$value['id'];//构造文章ID为键名的数组
            }
            $ar=array_rand($arr,$num);//随机元素键名
        return $ar;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-11-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档