一、随机查询一条数据

方法一:SELECT * FROM `table` ORDER BY RAND() limit 1

评价:不建议使用,效率非常低,官方文档中进行说明:Order By和RAND()连用,会多次扫描表,导致速度变慢。

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

解释:SELECT MAX(id) FROM `table` 这句话查询出最大的id值

SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))
这句获取一个小于MAX(id)的随机数

WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
这句话筛选出所有的大于生成随机数的id的行

    然后最后就把大于这个随机id的行查询出来,然后按照id排序,选择第一个,就相当与获取了所有行中随机的一行。

         评价:有问题,如果id不是从0开始的话,比如从10000开始自增,那么 SELECT floor(RAND() * (SELECT MAX(id) FROM `table`))
得到的将是会哟很大概率得到小于10000的值,经过where限定的查询结果将会是所有的查询结果的几率变大,最后limit 1获取的是第一行数据的几率变高。

方法三:SELECT * FROM `table` 
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECTMIN(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;

评价:解决了方法二中MAX(id)的问题,RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECTMIN(id) FROM `table`)可以获取MAX(id)和MIN(id)中的随机数。

方法四要比方法三稍快一点,http://blog.csdn.net/zxl315/article/details/2435368
这篇博客指出,15w条数据前者花费时间 0.147433 秒,后者花费时间 0.015130 秒。

以上解决方案都默认有一个不重复的数字字段,其实现在很多表的设计都是以一个自增段作为主键,当然还有一些是以uuid作为主键的,而没有数字键,这样的话,可以用mysql的函数将uuid的字符串转换成数字。而且还有一个问题,如果id字段的数字分布不均匀的话(比如按照1,4,5,6,7,8,45这样分布),也会造成随机查询的不合理,但是这里就不讨论那么复杂的问题了。


二、随机查询多条数据

方法一:把随机查询一条数据的limit
1修改成limit 5

评价:这样获取的数据会是连续的。

方法二:

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

from `table` limit 50) AS t2 on t1.id=t2.id

ORDER BY t1.id LIMIT 1;

解释:

SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id

from `table` limit 50)这样会获取50个随机数字,然后on
t1.id=t2.id会挑选出不大于50行的随机数据,然后取5条就好了。

mysql实现随机查询的更多相关文章

  1. 【面经】面试官:如何以最高的效率从MySQL中随机查询一条记录?

    写在前面 MySQL数据库在互联网行业使用的比较多,有些小伙伴可能会认为MySQL数据库比较小,存储不了很多的数据.其实,这些小伙伴是真的不了解MySQL.MySQL的小不是说使用MySQL存储的数据 ...

  2. mysql rand随机查询记录效率

    一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了. 但是真正测试一下才发现这样效率非常低.一个15万余条的 ...

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

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

  4. Oracle Mysql MSSql 三种数据库 随机查询 条 语句

    1. Oracle,随机查询查询语句-20条 select * from (  select  *  from 表名 order by dbms_random.value ) where rownum ...

  5. 分享:mysql 随机查询数据

    在mysql中查询5条不重复的数据,使用以下: 1 SELECT * FROM `table` ORDER BY RAND() LIMIT 5  就可以了.但是真正测试一下才发现这样效率非常低.一个1 ...

  6. 如何实现MySQL随机查询数据与MySQL随机更新数据?

    以下的文章主要介绍的是MySQL随机选取数据,对实现MySQ随机查询数据与MySQ随机更新数据的实际操作步骤的描述,以及对其实际操作中所要用到的语句的描述,以下就是对其具体操作步骤的描述. MySQL ...

  7. mysql随机查询记录的高效率方法

    mysql使用rand随机查询记录的高效率方法 一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了. 但是真 ...

  8. mysql随机查询符合条件的几条记录

    随机查询,方法可以有很多种.比如,查询出所有记录,然后随机从列表中取n条记录.使用程序便可实现.可是程序实现必须查询出所有符合条件的记录(至少是所有符合条件的记录id),然后再随机取出n个id,查询数 ...

  9. mysql 随机查询 记录集

    有时候需求需要随机从数据库查询若干条记录集,网上搜了一下,几篇博文都是些重复的.....不知道他们谁抄的谁的,这里除了介绍提供一种笔者自己想到的方法,本质都是利用mysql 的rand() 第一种方法 ...

随机推荐

  1. iscroll源码初涉

    最近尝试做web app时候,用上了神器iScroll,鉴于功力尚浅,并没有完全用好神器,所以今天特意来认真学习! 翻开官网,目前的版本是5,但是相关的文章并不多,具体的文件版本是: iscroll. ...

  2. 解决Sublime-Text-3在ubuntu下中文输入的问题

    在ubuntu下使用ST这神器已经一段日子了,但是一直有个纠结的问题,就是中文输入非常坑爹,曾经一段时间,使用inputHelper这个插件来解决, 但是……每次都要按个快捷键,弹出一个小小小框来输入 ...

  3. c# 输出excel、word实例只需一行代码

    第一.首先下载 WindICFrameNet.dll 下载地址:http://pan.baidu.com/s/1dDBqC9r 第二.前台代码 <div style="display: ...

  4. filter 以及 orderBy的使用

    filter用于关键字过滤操作,orderBy用于排序操作,运行界面如下: 点击标题Name与Email实现排序功能,输入框中输入关键字进行过滤,同时实现根据关键字进行过滤后进行排序操作: ng-re ...

  5. 新版TeamTalk部署教程(蓝狐)

    http://www.bluefoxah.org/teamtalk/new_tt_deploy.html

  6. jquery第六期:位置选择器

    <html> <head> <script type="text/javascript" src="jquery-1.10.1.js&quo ...

  7. 利用sql 存储过程把表中内容自动生成insert语句

    选中所在数据库 执行创建存储过程的sql CREATE proc [dbo].[spGenInsertSQL] (@tablename nvarchar(256),@sqlwhere varchar( ...

  8. Linux下如何选择文件系统:EXT4、Btrfs 和 XFS

    老实说,人们最不曾思考的问题之一是他们的个人电脑中使用了什么文件系统.Windows 和 Mac OS X 用户更没有理由去考虑,因为对于他们的操作系统,只有一种选择,那就是 NTFS 和 HFS+. ...

  9. UVA 11374 Airport Express(枚举+最短路)

    枚举每条商业线<a, b>,设d[i]为起始点到每点的最短路,g[i]为终点到每点的最短路,ans便是min{d[a] + t[a, b] + g[b]}.注意下判断是否需要经过商业线.输 ...

  10. syslog-ng-3.5.6把容器的单核cpu跑满

    Question 最近,偶然,会有人说,其docker容器中syslog-ng把cpu跑满,使用perf,mpstat,strace工具看到是syslog-ng在内核态cpu使用率很高,怀疑是某个系统 ...