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

第一种方法:

SELECT * FROM reportcard_patient_temp ORDER BY RAND() LIMIT 10

利用mysql的随机函数order by,这是最容易想到的,笔者在mysql 5.6.27上面explain查看了执行计划 :

+----+-------------+-------------------------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------------------+------+---------------+------+---------+------+------+---------------------------------+
| 1 | SIMPLE | reportcard_patient_temp | ALL | NULL | NULL | NULL | NULL | 2479 | Using temporary; Using filesort |
+----+-------------+-------------------------+------+---------------+------+---------+------+------+---------------------------------+
1 row in set

可以看出select type 是simple(这里是单表),在近40万的数据随机取了10条时间也只有1.2秒~2秒左右,还是可以接受的,并没有像网上说的哪有要重复查询多次。

第二种

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

这种方法最大的弊端在于如果主键不是自增的该如何?当然在主键自增的时候还是可以使用的

第三种,这是笔者自己想出的方法,既然要利用mysql自带的随机函数,那么对于不是自增的主键,如何把转化rand()就成了问题的关键,利用count(*)这个整数集

SELECT * FROM (
SELECT zyid ,ROUND(RAND()) AS newno FROM yw_syjgb GROUP BY zyid
)AS t ORDER BY t.newno asc LIMIT 10

同样的40万的记录集,随机取10条记录,时间只需要0.1秒左右,可以说比order by rand()提升还是蛮大的,当然也是可以 把 ROUND(COUNT(*)*RAND()*100) AS newno 作为limit后面的值随机定位记录集,需要注意的是要控制其为整数。

基于数据库层随机查询的还有些很多零碎的方法,这里笔者觉得符合自身业务复的方法其实还很多,比如你可以在程序里做随机挑选算法,或者自己实现一个rand()函数。

mysql 随机查询 记录集的更多相关文章

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

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

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

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

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

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

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

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

  5. 使用Anemometer分析MySQL慢查询记录

    数据库管理员一般是用percona的toolkit工具来分析MySQL慢查询记录,但是不够直观. 下面介绍一款比较直观的工具来统计分析MySQL慢查询记录anemometer. 在使用之前需要安装pe ...

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

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

  7. sql语句之随机查询记录和批量插入--基于mysql

    本周遇到了好几次数据库方面的问题,一个是上一篇文章提到的因为要修改数据结构引起的在表间复制字段的需求,另一个就是这篇文章要写的:1,从某个数据表中按照某个字段不重复的随机选取几百条记录:2,然后把这些 ...

  8. mysql 慢查询记录方法

    ========================================================= 方法一: 这个方法我正在用,呵呵,比较喜欢这种即时性的. Mysql5.0以上的版本 ...

  9. CI生成查询记录集result(),row(),row_array().....

    result() 该方法执行成功返回一个对象数组,失败则返回一个空数组. 一般情况下,我们使用下面的方法遍历结果,代码就像这样: $query = $this->db->query(&qu ...

随机推荐

  1. CentOS 7.4中firewall防火墙详解和配置以及切换为iptables防火墙

    转载:https://blog.csdn.net/xlgen157387/article/details/52672988 一.firewall介绍 CentOS 7中防火墙是一个非常的强大的功能,在 ...

  2. <context:annotation-config/>,<context:component-scan/>,<mvc:annotation-driven/>区分

    链接:http://blog.csdn.net/baple/article/details/16864175 链接:http://blog.csdn.net/Baple/article/details ...

  3. Servlet传统配置方式和Servlet3.0使用注解的方式

    一.Servlet的传统配置方式 在JavaWeb开发中, 每次编写一个Servlet都需要在web.xml文件中进行配置,如下所示: <servlet> <servlet-name ...

  4. 前端(四):JavaScript面向对象之自定义对象

    一.对象 1.字面量创建对象 var person = { name: "sun", age: 18, work: function () { console.log(this.n ...

  5. Redis 列表 List 主要操作函数

    /** * redis 列表 List Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列表的头部(左边)或者尾部(右边) */ //lpush 新增一个列,多个列可以用空格隔 ...

  6. 关于fflush、缓冲区、scanf、EOF等问题真麻烦

    1.为什么 fflush(stdin)是错的 http://u637.springnote.com/pages/6288463.xhtml(已经bad request了) 首先请看以下程序: #inc ...

  7. Nginx配置(需要把nginx的根目录指向ftp上传文件的目录。)

    改成

  8. cocos2d-x 3.2 关闭按钮点击立马销毁自己报错

    cocos2d-x 3.2 Button点击事件里调用移除当前层报错 http://www.th7.cn/program/ios/201408/271227.shtml 诡异的错误,点击关闭按钮,居然 ...

  9. php系统函数-----数组函数

  10. Web 漏洞分析与防御之 XSS(一)

    原文地址:Web 漏洞分析与防御之 XSS(一) 博客地址:http://www.extlight.com 一.全称 跨站脚本攻击(Cross Site Scripting) 二.原理 通过在网站中的 ...