rand()随机的效率问题

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

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

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

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

代码:

$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;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

一个SQL语句引发的ORA-00600错误排查(一) (r9笔记第64天)

最近有一个同事问我一个问题,说他运行一个SQL语句抛出了ORA-00600的错误,想让我帮忙分析一下,这种问题听了确实有兴趣,了解了问题的大体情 况之后,发现这...

35240
来自专栏腾讯云流计算

Apache Calcite 功能简析及在 Flink 的应用

• Apache Calcite 是一个动态数据的管理框架,可以用来构建数据库系统的语法解析模块

1.6K70
来自专栏Java爬坑系列

【MySQL疑难杂症】如何将树形结构存储在数据库中(方案三 Closure Table)

  今天介绍将树形结构存储在数据库中的第三种方法——终结表(原谅我这生硬的翻译。。)。   继续用上一篇的栗子,下面是要存储的结构图: image.png  ...

71280
来自专栏企鹅号快讯

利用pandas进行数据分析(二):索引与层次化索引

继上一节的基本数据结构的介绍之后,本节继续介绍中操作和的基本手段。一个最常用的操作就是索引,如何根据分析目的对和进行索引访问得到数据是利用进行数据分析的基本技能...

23490
来自专栏Python爬虫实战

设计模式:单例模式

想想一下这个场景,一个系统中可以存在多个打印任务,但是只有一个正在工作的任务。我们怎样才能保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量可以使得一...

8520
来自专栏程序员的SOD蜜

同样的SQL语句在查询分析器执行很快,但是网站上执行超时的诡异问题

    同样的SQL语句在查询分析器执行很快,但是网站上执行超时,这个问题以前遇到过,解决办法是重新启动服务器,但过一段时间后(时间长短不一定,一般为一天后),...

29970
来自专栏tkokof 的技术,小趣及杂念

Singleton模式小探

设计模式,这个多年前因为《设计模式》这本书而开始名声鹊起的软件名词,相信在当今年代早已为相关人士耳熟能详,你可以像大多数人那样对他顶礼膜拜,你也可以如极少数人...

11230
来自专栏MongoDB中文社区

玩转MongoDB: 索引,速度的引领

数据库索引与书籍的索引类似,有了索引就不需要翻整本书,数据库可以直接在索引中查找,在索引中找到条目后,就可以直接跳到目标文档的位置,这可以让查找的速度提高几个数...

16040
来自专栏java系列博客

单例模式的各种实现

20960
来自专栏WindCoder

网易MySQL微专业学习笔记(五)-SQL语言进阶

这个系列属于个人学习网易云课堂MySQL数据库工程师微专业的相关课程过程中的笔记,本篇为其“MySQL数据库对象与应用”中的MySQL数据类型相关笔记。

6910

扫码关注云+社区

领取腾讯云代金券