在mysql中查询5条不重复的数据,使用以下:

SELECT * FROM `table` ORDER BY RAND() LIMIT 5

就可以了。但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上
搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。

SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id ASC LIMIT 5;

但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。
上面的语句采用的是JOIN,mysql的论坛上有人使用

SELECT *
FROM `table`
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
ORDER BY id LIMIT 1;

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

SELECT * FROM `table`
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
ORDER BY id LIMIT 1;

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

SELECT * FROM `table`
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))
ORDER BY id LIMIT 1;
SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;

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

sql随机取5条信息相关推荐

  1. python简单爬虫代码-python爬虫超简单攻略,带你写入门级的爬虫,抓取上万条信息...

    原标题:python爬虫超简单攻略,带你写入门级的爬虫,抓取上万条信息 最近经常有人问我,明明看着教程写个爬虫很简单,但是自己上手的时候就麻爪了...那么今天就给刚开始学习爬虫的同学,分享一下怎么一步 ...

  2. mysql查询结果随机取一个_从SQL查询结果随机取一条数据

    最近工作中会涉及复杂的SQL语句,还是挺有意思的.以前想写没有应用场景,现在正好可以多锻炼锻炼.我觉得在实际开发中,程序代码并不是最难的,最难的还是SQL.SQL逻辑性最强,而且还要很清楚表设计,业务 ...

  3. sql 只取一条记录_后端程序员必备:书写高质量SQL的30条建议

    前言 本文将结合实例demo,阐述30条有关于优化SQL的建议,多数是实际开发中总结出来的,希望对大家有帮助. 1.查询SQL尽量不要使用select *,而是select具体字段. 反例子: sel ...

  4. oracle 取任意一条数据,oracle随机取一条数据详解

    Oracle 随机获取N条数据 当我们获取数据时,可能会有这样的需求,即每次从表中获取数据时,是随机获取一定的记录,而不是每次都获取一样的数据,这时我们可以采取Oracle内部一些函数,来达到这样的目 ...

  5. oracle和sql server取第一条记录的区别以及rownum详解

    我们知道学生可能有重名的情况,那么当重名的时候假设只需要取得重名结果集中的第一条记录. sql server:select top(1) num,Name from M_Student where n ...

  6. thinkphp 随机取10条数据_spark调优-数据倾斜

    1.数据倾斜发生时的现象 绝大多数task执行得都非常快,但个别task执行极慢.比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时.这种情况 ...

  7. mysql 在结果集中随机_MySql从表结果集中随机取一条数据

    博客文章地址:http://blog.csdn.net/macwhirr123/article/details/7489484 Select*from(Select(@rowNo :=@rowNo+1 ...

  8. mysql随机取5条数据_【转】mysql实现随机获取几条数据的方法

    sql语句有几种写法 1:SELECT * FROM tablename ORDER BY RAND() LIMIT 想要获取的数据条数: 2:SELECT *FROM `table` WHERE i ...

  9. 数据库随机取n条记录

    SQL Server SELECT TOP N  *  FROM  表名  ORDER BY  NEWID() My SQL  SELECT  *  FROM  表名 ORDER BY RAND() ...

最新文章

  1. R语言ggplot2可视化:自定义设置X轴上的时间间隔(中断、以年为单位),使用scale_x_date()自定义设置坐标轴间隔和标签、添加标题、副标题、题注信息
  2. trycatch抛出异常_Java生鲜电商平台架构中,如何统一异常处理及架构实战
  3. 【js】vue 2.5.1 源码学习(二) 策略合并
  4. 在PyCharm下使用Jupyter Notebook
  5. ASP.net 省市级联(用户控件)适用用framework3.5以上版本
  6. java数组复制_Java自学-数组 复制数组
  7. eclipse默认项目部署路径(.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps) 改为自己的tomcat真实路径方法
  8. 我如何判断漏洞奖励计划是否值得参加?如何获得最大收益?
  9. php socket 执行,PHP异步调用socket实现代码
  10. VMware密钥激活
  11. python2.x 获取网页内容
  12. 数据库 insert 数据的几种方式
  13. 云计算是什么?它有哪些形式?
  14. blp和biba属于哪种访问控制_CISP官方信息安全技术章节练习二
  15. 魅族路由器(极速版)刷老毛子(padavad)固件-全网最详细教程
  16. 题目52:输入两个正整数m和n,判断m和n是否互质(即最大公约数为1),是则输出Yes,否则输出No。
  17. Plantuml类图用法
  18. HTTP之Chunk
  19. Distiller 安装时环境配置的一些可选项
  20. 【UV打印机】电气之光电传感器

热门文章

  1. 大数据:千万个“路人甲”的价值逻辑
  2. 准备客串一回Java讲师
  3. Linux下安装oracle的脚本,linux系统oracle数据安装配置脚本
  4. 【笔记】LaTeX数学公式
  5. curl -u “username“ https://api.github.com 转换http请求
  6. 【FAQ】软件保护系统Themida常见问题集锦(一)—Themida和WinLicense有什么区别?...
  7. linux负载均衡之关于负载均衡
  8. 温度 数值模拟 matlab,西安交通大学——温度场数值模拟matlab
  9. Python爬取微信好友的信息
  10. TextView 多行文字末尾添加图片