一直以为mysql随机查询几条数据,就用

SELECT*FROM`table`ORDERBYRAND()LIMIT5

就可以了。
但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上

查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。

You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.

搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。

SELECT*
FROM`table`ASt1JOIN(SELECTROUND(RAND()*(SELECTMAX(id)FROM`table`))ASid)ASt2
WHEREt1.id>=t2.id
ORDERBYt1.idASCLIMIT5;

但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。

上面的语句采用的是JOIN,mysql的论坛上有人使用

SELECT*
FROM`table`
WHEREid>=(SELECTFLOOR(MAX(id)*RAND())FROM`table`)
ORDERBYidLIMIT1;

我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距。总觉有什么地方不正常。

于是我把语句改写了一下。

SELECT*FROM`table`
WHEREid>=(SELECTfloor(RAND()*(SELECTMAX(id)FROM`table`)))
ORDERBYidLIMIT1;

这下,效率又提高了,查询时间只有0.01秒

最后,再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
完整查询语句是:

SELECT*FROM`table`
WHEREid>=(SELECTfloor(RAND()*((SELECTMAX(id)FROM`table`)-(SELECTMIN(id)FROM`table`))+(SELECTMIN(id)FROM`table`)))
ORDERBYidLIMIT1;
SELECT*
FROM`table`ASt1JOIN(SELECTROUND(RAND()*((SELECTMAX(id)FROM`table`)-(SELECTMIN(id)FROM`table`))+(SELECTMIN(id)FROM`table`))ASid)ASt2
WHEREt1.id>=t2.id
ORDERBYt1.idLIMIT1;

最后在php中对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。

转载于:https://www.cnblogs.com/atck/articles/2357187.html

MYSQL 取随机记录的方法相关推荐

  1. MYSQL的随机抽取实现方法

    MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1. ...

  2. mysql随机选择记录表_Mysql表中取随机记录

    RAND()是Mysql中的取随机数函数,该函数返回一个float型数值v,v的值为0 例如: mysql> SELECT RAND(); -> 0.9233482386203 mysql ...

  3. UEC++:UKismetMathLibrary::RandomPointInBoundingBox盒体内取随机坐标的方法

    首先先简单的创建一个UboxComponent盒体: .h文件内容: .cpp文件内容: 创建一个函数用来返回盒体范围内的随机坐标: 实际上就这么简单就结束了,为了加深自己对这个的印象还是叨叨下这几个 ...

  4. mysql外建名是随机的吗_创建角色随机名字(mysql抽取随机记录)和mysql游标的使用_MySQL...

    最近在开发中遇到了一些问题,在此记录一下解决的方法,已作备忘. 1.现在创建游戏角色的时候,基本上都是支持角色名字随机的,以前此功能在客户端用代码实现,然后向服务器请求并验证,后来发现有时候连续几次都 ...

  5. ASP读取ACCESS数据库随机记录的方法

    检查了一些贴子对于MSSQL数据库一般可以采用这样的语句: <% select top 50 * from someTable order by NewID() %> 但是如果是Acces ...

  6. MYSQL的随机查询的实现方法

    SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(i ...

  7. mysql 随机记录 newid(),order by newid() 各种数据库随机查询的方法

    这篇文章主要为大家详细介绍了order by newid() 各种数据库随机查询的方法,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! SQL S ...

  8. MySQL查询随机数据的4种方法和性能对比

    从MySQL随机选取数据也是我们最常用的一种发发,其最简单的办法就是使用"ORDER BY RAND()",本文介绍了包括ORDER BY RAND()的4种获取随机数据的方法,并 ...

  9. mysql分组随机取数据_MySql分组后随机获取每组一条数据的操作

    思路:先随机排序然后再分组就好了. 1.创建表: create table `xdx_test` ( `id` int(11) not null, `name` varchar(255) defaul ...

最新文章

  1. php common errors
  2. CloudStack 的配置、部署与管理,以及 API 的使用
  3. python虚拟cpu性能_python实现可视化动态CPU性能监控
  4. [剑指offer]面试题9:斐波那契数列
  5. Mac不装软件校验MD5和SHA1值
  6. oracle的标准写法,oracle 表连接特有写法与标准写法
  7. 每天进步一点点《ML - 从极大似然到EM算法》
  8. ios双指放大缩小_用PS设计APP过程中改进IOS设计流程的30个秘诀
  9. 智能家居告别荒蛮:机会与挑战并存
  10. POJ3275 Ranking the Cows【关系闭包】
  11. No package ‘glib-2.0‘ found/No package ‘gobject-2.0‘ found
  12. Alpine Linux如何安装软件
  13. soem主站移植到rt thread smart操作系统
  14. 2020最新xcode打包IPA(完整详细图文详解)
  15. MFC对话框美化四(自绘标题栏)
  16. 存储资源盘活系统,“盘活”物联网架构难题
  17. 图像处理学习2,边缘检测1(sobel算子,kirsch算子)
  18. 上海交大和MIT提出的软性机械手,可提供实时的触觉控制
  19. 04741计算机网络原理2018年版-第八章 网络安全基础 知识要点
  20. 源码编译安装部署LAMP平台(使用Apache,MySQL与PHP搭建Discuz论坛实例)

热门文章

  1. CSS中Float概念相关文章
  2. springMVC文件下载
  3. Error ./include/caffe/util/mkl_alternate.hpp:11:19: fatal error: cblas.h: 没有那个文件或目录...
  4. Linux下监控文件系统
  5. A+B/A*B求A和B
  6. 银行业务常用基本概念
  7. GUI(一) 一些自已看的东西
  8. 瑞友虚拟服务器网页登录,瑞友云端虚拟专网系统
  9. java qt jni_java JNI 实现原理 (二) Linux 下如何 load JNILibrary
  10. Win64 驱动内核编程-17. MINIFILTER(文件保护)