mysql 随机查询 记录集

 

 

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值