mysql 随机查询 rand() 详细介绍

学习笔记 马富天 2018-12-26 10:33:51 80 0

【摘要】相信大家都做过或者了解过在网页显示随机推荐的文章或者商品的功能,在网页上随机显示若干条不重复的文章或商品,很多时候是不是会把数据表中的所有数据提取出来,然后用编程语言实现随机提取其中的 ID 。而本文通过多次实验,总结了 MySQL 中的二种随机查询的方法及对应使用的场景。

实现的最终原理主要在于对 rand() 函数的应用,例如:select rand() 是随机生成一个 0-1 之间的浮点数。

MySQL 的随机查询有以下几种方式:

(1)【执行效率低、随机程度高】

直接使用 order by rand(),sql 简单,但若数据量很大则查询效率相当低

  1. # 从 table_name 表中随机提取 5 条数
  2. select * from `table_name` order by rand() limit 5;

这种方法数据列会被多次扫描,优点是查询出来的数很随机,limit n 条记录之后,得到的 n 条记录都是随机的,不管表中含有多少条记录,查询出来的总是随机的、已被打乱的、不重复的,数量也是正确的。这条查询语句适用于数据量较小的场景中。

本人在自己的系统(windows 10、内存 16 G、64 位)中进行过测试,表中有 5 万条记录,随机 10 条记录,费时:0.02 秒。0.02 秒应该就是可以接受的一定范围了,也就是在记录总数在 5 万之内的是可以使用 order by rand() 的方式进行随机搜索的,适用于个人博客、小型企业官网。当然也有可能是我电脑性能较好,所以时间较短,具体看性能,一般 order by rand() 在一万条记录内是完全支持的。

(2)【执行效率高、每次只能随机取一条】

以下两种 SQL 所取出的值是一样的,就是表达方式不同,推荐采用 join 方式来查询,因为效率比在 where 条件中使用 rand() 要快。以下两条 SQL 对于表中的所有记录都是有几率提取出来的。

  1. # where 方式
  2. SELECT * FROM `table_name` WHERE id >= (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table_name`))) LIMIT 1;
  3. # join 方式
  4. SELECT * FROM `table_name` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table_name`)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id ASC LIMIT 1; 

这种方法的优点在于数据量大的时候,查询效率还能够保持。缺点在于 limit n 条记录后,得到的数并不是最随机的,只能随机取出一条数,这条数是随机的,若是 n > 1 则会出现不随机问题,例如表中只有 6 条数据,而 n = 6 ,则取出来的数可能不到 6 条,且取出来的数是 id 升序排序的。此方法适合用于只查询一条随机记录的场景,但是执行效率很高,可以用于大数据量的情况。

当然,如果数据量较大的时候,如上百、上千条的时候,可以 limit n 查询一下, n 可以大于 1,虽然随机并不是最为随机的效果,但是对于上百上千条数据,仅仅随机十来条数据,这样的需求是可以满足的。

最后,即使我这里给出了一个参考值,但是最终的选择方式还是要依据实际情况来选择的。另外今天是圣诞节,祝大家学习快乐,工作顺利!

版权归 马富天个人博客 所有

本文标题:《mysql 随机查询 rand() 详细介绍》

本文链接地址:http://www.mafutian.com/404.html

转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^

0

0

上一篇《 PHP 判断某个 IP4 是否属于某一个 IP 段(ip2long()) 》 下一篇《 PHP 下载文件【通用版本】 》

暂无评论

评论审核未开启
表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情
验证码

TOP10

  • 浏览最多
  • 评论最多